backtracing

5月10日

1 37  Sudoku Slover

 public void solveSudoku(char[][] board) {
        if(board == null || board.length == 0)
            return;
        slove(board);
    }
    public boolean slove(char[][] board){
        for (int i = 0; i < board.length; i++)
        {
            for (int j = 0; j < board[0].length; j++)
            {
                if (board[i][j] == '.')
                {
                    for (char c = '1'; c <= '9'; c++)
                    {
                        if (isValue(board, i, j, c))
                        {
                            board[i][j] = c;
                            if (slove(board))
                                return true;
                            else 
                                board[i][j] = '.';
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }
    public boolean isValue(char[][] board, int row, int col, char c)
    {
        for (int i = 0; i < 9; i++)
        {
            if (board[i][col] != '.' && board[i][col] == c) return false;
             if (board[row][i] != '.' && board[row][i] == c) return false;
             if (board[3 * (row/3) + i/3][3 *(col/3) + i % 3] != '.' &&
             board[3 * (row/3) + i/3][3 *(col/3) + i % 3] == c) return false;
        }
        return true;
    }
View Code

2 51 N-Queens

  public List<List<String>> solveNQueens(int n) {
        List<List<String>> res = new ArrayList<>();
        help(n, 0, new int[n], res);
        return res;
    }
    public void help(int n, int row, int[] colforrow, List<List<String>> res)
    {
        if (row == n)
        {
            ArrayList<String> item = new ArrayList<>();
            for (int i = 0; i < n; i++)
            {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < n; j++)
                {
                    if (colforrow[i] == j)
                        sb.append('Q');
                    else 
                        sb.append('.');
                }
                item.add(sb.toString());
            }
            res.add(item);
            return;
        }
        for (int i = 0; i < n; i++)
        {
            colforrow[row] = i;
            if (check(row, colforrow))
            {
                help(n, row + 1, colforrow, res);
            }
        }
    }
View Code

3 52 N-Queens II

    public int totalNQueens(int n) {
        ArrayList<Integer> res = new ArrayList<>();
        res.add(0);
        help(n, 0, new int[n], res);
        return res.get(0);
    }
    private void help(int n, int row, int[] columnForRow, ArrayList<Integer> res)  
   {  
    if(row==n)  
    {  
        res.set(0,res.get(0)+1);  
        return;  
    }  
    for(int i=0;i<n;i++)  
    {  
        columnForRow[row]=i;  
        if(check(row,columnForRow))  
        {  
            help(n,row+1,columnForRow,res);  
        }  
    }  
}  
private boolean check(int row, int[] columnForRow)  
{  
    for(int i=0;i<row;i++)  
    {  
        if(columnForRow[i]==columnForRow[row] || Math.abs(columnForRow[row]-columnForRow[i])==row-i)  
            return false;  
    }  
    return true;  
} 
View Code

4 77  combinations  分子问题

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> res = new ArrayList<>();
        if (n <= 0 || n < k) return res;
        help(n, k, 1, new ArrayList<Integer>(), res);
        return res;
    }
    public void help(int n, int k, int start, ArrayList<Integer> item, List<List<Integer>> res)
    {
        if (item.size() == k)
        {
            res.add(new ArrayList<Integer>(item));
            return;
        }
        for (int i = start; i <= n; i++)
        {
            item.add(i);
            help(n, k, i + 1, item, res);
            item.remove(item.size() - 1);
        }
    }
View Code

 5 89 Gray Code

    public List<Integer> grayCode(int n) {
        List<Integer> res = new ArrayList<>();
        res.add(0);
        for (int i = 0; i < n; i++)
        {
            int size = res.size();
            for (int k = size - 1; k >= 0; k--)
            {
                res.add(res.get(k)|1<<i);
            }
        }
        return res;
    }
View Code

6 211 Add and search Word

public class WordDictionary {

    public class TrieNode{
        public TrieNode[] children = new TrieNode[26];
        public String item = "";
    }
    private TrieNode root = new TrieNode();
    /** Initialize your data structure here. */
    public WordDictionary() {
    }
    
    /** Adds a word into the data structure. */
    public void addWord(String word) {
        TrieNode node = root;
        for (char c : word.toCharArray())
        {
            if (node.children[c - 'a'] == null)
            {
                node.children[c - 'a'] = new TrieNode();
            }
            node = node.children[c - 'a'];
        }
        node.item = word;
    }
    
    /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
    public boolean search(String word) {
        return match(word.toCharArray(), 0, root);
    }
    private boolean match(char[] chs, int k, TrieNode node)
    {
        if (k == chs.length) return !node.item.equals("");
        if (chs[k] != '.')
        {
            return node.children[chs[k] - 'a'] != null && match(chs, k + 1, node.children[chs[k]-'a']);
        }
        else
        {
            for (int i = 0; i < node.children.length; i++)
            {
                if (node.children[i] != null)
                {
                    if (match(chs, k + 1, node.children[i]))
                        return true;
                }
            }
        }
        return false;
    }
}
View Code

7 212 Word Search II

    Set<String> res = new HashSet<>();
    public List<String> findWords(char[][] board, String[] words) {
        Trie trie = new Trie();
        for (String str : words)
        {
            trie.insert(str);
        }
        int m = board.length, n = board[0].length;
        boolean[][] visited = new boolean[m][n];
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                dfs(board, visited, "", i, j, trie);
            }
        }
        return new ArrayList<String>(res);
    }
    public void dfs(char[][] board, boolean[][] visited, int i, int j, String item, Trie trie)
    {
        if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) return;
        if (visited[i][j]) return;
        item += board[i][j];
        if (!trie.startsWith(item)) return;
        if (trie.search(item)) res.add(item);
        visited[i][j] = true;
        dfs(board, visited, i, j - 1, item, trie);
        dfs(board, visited, i, j + 1, item, trie);
        dfs(board, visited, i + 1, j, item, trie);
        dfs(board, visited, i - 1, j, item, trie);
        visited[i][j] = false;
    }
View Code

 

posted on 2017-05-10 13:11  wheleetcode  阅读(127)  评论(0编辑  收藏  举报