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>>();
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值