LeetCode 131.分割回文串

分割回文串

LeetCode 131 分割回文串 131

解题关键: 搜索+判断是否为子串是否为回文

预处理子串是否为回文串核心代码:

状态转移方程:g[i][j]=(s[i]==s[j])&&s[i+1][j-1]
i、j指针指向的字符要一致并且(i,j)的子串(i+1,j-1)为回文串

判断回文串完整代码:

  for(int i=n-1;i>=0;i--)
        for(int j=i+1;j<n;j++){
            g[i][j]=(s[i]==s[j])&&g[i+1][j-1];
        }

搜索核心代码:

void dfs(int i,const string &s){
	if(i==s.size()){
    	ans.emplace_back(cur);
        	return;
        }
    for(int j=i;j<s.size();j++){
    	if(g[i][j]){ //这里可以改为记忆化搜索if(isPalindrome(s,i,j)==1)
        	cur.push_back(s.substr(i,j-i+1));
            dfs(j+1,s)//j已经作为当前回文串的右边界,要从j+1处开始搜搜
            cur.pop_back();//清除该层搜索记录
            }
        }
}

记忆化搜索核心代码:

    //f[i][j]值为0表示还未搜索到,1表示(i,j)区间为回文串,-1表示(i,j)区间不是回文串
int isPalindrome(const string& s,int i,int j){
	if(f[i][j]){
    	return f[i][j];
  	}
    if(i>=j){
       	return f[i][j]=1;
    }
  	return f[i][j]=(s[i]==s[j]&&isPalindrome(s,i+1,j-1));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值