BFS

LC127. Word Ladder
Input:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

Output: 5

Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.

class Solution {
    //大致的过程就是
    // hit --> hot --> dot, lot --> (dog, lot), log -->cog(和最末单词比较是一致的返回5)
    public int ladderLength(String beginWord, String endWord, List<String> wordList) 
    {
        Set<String> dict = new HashSet<>();
        for (String word : wordList){
            dict.add(word);
        } // 把单词放进去dict里
        
        HashSet<String> set = new HashSet<>();//用来放所有演变的单词
        Queue<String> q = new LinkedList<String>();
        q.offer(beginWord);
        set.add(beginWord);
        
        int len = 1;
        while(!q.isEmpty()){
            len++;
            int size = q.size();
            for (int i = 0; i < size; i++){
                String word = q.poll();
                for(String nextWord : getNextWord(word, dict)){
                    if(set.contains(nextWord)) continue;//如果set已经含有了这个单词跳过
                    if(nextWord.equals(endWord)) return len;//如果和目标单词一样说明找到了,返回长度
                    
                    set.add(nextWord); //都是不的话把单词放进set里
                    q.offer(nextWord);//队列里也加入这个单词
                }
            }
        }
        return 0;
    }
    private ArrayList<String> getNextWord(String word, Set<String> dict){
        ArrayList<String> nextWords = new ArrayList<>();
        for (char c = 'a'; c <= 'z'; c++){
            for (int i = 0; i < word.length(); i++){
                if (c == word.charAt(i)) continue;// find first element 
            String nextWord = replace(word, i, c);
            if (dict.contains(nextWord)){
                nextWords.add(nextWord);
            }
        }
        }
        return nextWords;
    }
    private String replace(String s, int index, char c){
        char[] chars = s.toCharArray();
        chars[index] = c;
        return new String(chars);
    }
}

LC130. Surrounded Regions

class Solution {
    public void solve(char[][] board) {
        int n = board.length;
        if(n == 0) return;
        int m = board[0].length;
        
        for (int i = 0; i < n; i++){
            bfs(board, i, 0);
            bfs(board, i, m-1);
        }
        for (int j = 0; j < m; j++){
            bfs(board, 0, j);
            bfs(board, n-1, j);
        }
        
        for (int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if (board[i][j] == 'W'){
                    board[i][j] = 'O';
                } else {
                    board[i][j] = 'X';
                }
            }
        }
    }
     //这个函数的意思是只要检查出边界是0,再看有多少和边界联通的0,只要有联通的就不能改为x
    private void bfs(char[][] board, int sx, int sy){
        if (board[sx][sy] == 'X') return;
        int n = board.length;
        int m = board[0].length;
        int[] dx = {0,1,0,-1};
        int[] dy = {1,0,-1,0};
        
        Queue<Integer> qx = new LinkedList<>();
        Queue<Integer> qy = new LinkedList<>();
        qx.offer(sx);
        qy.offer(sy);
        board[sx][sy] = 'W'; //initialize board element to W
        while(!qx.isEmpty()){
            int cx = qx.poll();
            int cy = qy.poll();
            
            for(int i = 0; i < 4; i++){
                int nx = cx + dx[i];
                int ny = cy + dy[i];//find 0-right, 1-down, 2-left, 3-top element of a element
                if(nx >= 0 && nx < n && ny >=0 && ny < m && board[nx][ny] == 'O'){
                    board[nx][ny] = 'W';
                    qx.offer(nx);
                    qy.offer(ny);
                } 
            }
        }
    }
}

LC200. Number of Islands
Input:
11110
11010
11000
00000

Output: 1

  public int numIslands(char[][] grid) {
        if(grid == null || grid.length == 0 || grid[0].length == 0) return 0;
        int m = grid.length; //设置图长
        int n = grid[0].length;//设置图宽
        int islands = 0;//设置岛的大小
        
        for (int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if (grid[i][j] == '1'){//如果遇到1就开始计算所有联通的区域
                    bfs(grid, i, j);
                    islands++;//计算完成岛的数量加1
                }
            }
        }
       return islands; 
    }

    private void bfs(char[][] grid, int x, int y){
        int[] dx = {0, 1, 0, -1};//x方向变量
        int[] dy = {1, 0, -1, 0};//y方向变量
        int m = grid.length;
        int n = grid[0].length;
        
        Queue<Integer> qx = new LinkedList<>();
        Queue<Integer> qy = new LinkedList<>();//xy坐标分别加上队列
        
        qx.offer(x);
        qy.offer(y);
        grid[x][y] = '0';
        while(!qx.isEmpty()){
            int cx = qx.poll();
            int cy = qy.poll();  //cx是从队列里取出的元素
            for (int i = 0; i < 4; i++){
                int nx = cx + dx[i];
                int ny = cy + dy[i];//nx是计算输入点的上下左右四个点
                
                if (!(nx >= 0 && nx < m && ny >=0 && ny < n)) continue;
                if (grid[nx][ny] == '1'){
                    grid[nx][ny] = '0';//已经扫过的元素要变零防止再扫一遍
                    qx.offer(nx);
                    qy.offer(ny); //把新的xy坐标放进队列里继续搜索相邻的,凡是搜索到的都标为0,这个函数是搜索所有可能的联通点
                }
            }    
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容