leetcode--Palindrome Partitioning

思路:

首先想到用深度優先,每次遞歸傳入之前的路徑鏈表,以及剩下的字符串。對剩下的字符串再次劃分成兩部分part1、part2,先判斷part1是否迴文然後將part1放入路徑鏈表,和part2一起傳入再次遞歸。

/*List<List<String>> lists = new ArrayList<List<String>>();

    public List<List<String>> partition(String s) {
        if (s == null) return lists;
        if (s.length() == 0) return lists;
        for (int i = 1; i < s.length(); i++) {
            List<String> list = new ArrayList<String>();
            String part1 = s.substring(i);
            String part2 = s.substring(0,i);
            list.add(part2);
            dfs(part1, list);
        }
        return lists;
    }

    public void dfs(String s, List<String> list) {
        if (s.length() == 0) {
            lists.add(list);
            return;
        }
        for (int i = 1; i <= s.length(); i++) {
            List<String> l = new ArrayList<String>(list);
            if(isPalindrome(s.substring(0,i))){
                l.add(s.substring(0, i));
                dfs(s.substring(i), l);
            }
        }
    }*/

    public boolean isPalindrome(String s){
        for(int i=0;i<=(s.length()-1)/2;i++){
            if(s.charAt(i)!=s.charAt(s.length()-1-i)){
                return false;
            }
        }
        return true;
    }

結果發現超時,不能和之前的backtrackng一樣通過dfs來解決。需要把遞歸轉化成動態規劃。

2.建立hashmap<Integer,List<List<String>>hm,key=i對應的鍵值表示到String s第i個元素的所有迴文組合。從頭至尾將回文組合填入。假設要填入key=j對應的鍵值,我們遍歷key=0->j-1對應的鍵值,判斷key+1,j的字串如果迴文,則生成新的list並放入鍵值對應的集合。

public boolean isPalindrome(String s){
        for(int i=0;i<=(s.length()-1)/2;i++){
            if(s.charAt(i)!=s.charAt(s.length()-1-i)){
                return false;
            }
        }
        return true;
    }

    public List<List<String>> partition(String s){
        HashMap<Integer,List<List<String>>>hm=new HashMap<Integer,List<List<String>>>();
        for(int i=0;i<s.length();i++){
            List<List<String>>current;
            if(isPalindrome(s.substring(0,i+1))){
                List<List<String>>lists=new ArrayList<List<String>>();
                List<String>list=new ArrayList<String>();
                list.add(s.substring(0,i+1));
                lists.add(list);
                hm.put(i,lists);
                current=lists;
            }else{
                current=new ArrayList<List<String>>();
            }
            for(int j=0;j<i;j++){
                if(hm.containsKey(j)&&isPalindrome(s.substring(j + 1, i + 1))){
                    List<List<String>>pre=hm.get(j);
                    for(List<String>l1:pre){
                        List<String>l2=new ArrayList<String>(l1);
                        l2.add(s.substring(j+1,i+1));
                        current.add(l2);
                    }
                }
            }
            if(!current.isEmpty())hm.put(i,current);
        }
        if(hm.containsKey(s.length()-1))return hm.get(s.length()-1);
        return new ArrayList<List<String>>();
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章