136.Palindrome Partitioning-分割回文串(中等题)

分割回文串

  1. 题目

    给定一个字符串s,将s分割成一些子串,使每个子串都是回文串。
    返回s所有可能的回文串分割方案。

  2. 样例

    给出 s = “aab”,返回
    这里写图片描述

  3. 题解

    回溯法,如s = “aab”,对s进行遍历。
    a作为单个字符显然是回文,则将a加入list,继续对”ab”进行递归查找。
    第二个a也是回文,则继续将a加入list并继续对”b”进行递归,得到[a,a,b]。
    同时进行回溯,由于aa也是回文,则对”b”进行递归查找,得到[aa,b]。
    继续回溯,由于aab不是回文,递归结束。

public class Solution {
    /**
     * @param s: A string
     * @return: A list of lists of string
     */
    public List<List<String>> partition(String s) {
        List<List<String>> result = new ArrayList<List<String>>();
        find(s,result,new ArrayList<String>(),0);
        return result;
    }

    private void find(String s,List<List<String>> result,ArrayList<String> list,int start)
    {
        if (start > s.length()-1)
        {
            result.add(list);
            return;
        }
        for (int i=start;i<s.length();i++)
        {
            if (valid(s,start,i))
            {
                ArrayList<String> ls = new ArrayList<String>(list);
                ls.add(s.substring(start,i+1));
                find(s,result,ls,i+1);
            }
        }
    }

    private boolean valid(String s, int start, int end)
    {
        while (start <= end)
        {
            if (s.charAt(start++) != s.charAt(end--))
            {
                return false;
            }
        }
        return true;
    }
}

Last Update 2016.10.12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值