java回文算法递归,最长的回文子串自上而下的递归方法

我想在Leetcode上解决Longest palindromic substring . 我知道这个问题的解决方案,如围绕中心扩展或dynamic programming bottom up approach . 出于纯粹的教育目的,我想以自上而下的递归方式解决这个问题 . 我试图找到类似于描述here或here的解决方案 . (问题略有不同) . 我有这个功能:

private (int Start, int End) Longest(string s, int i, int j)

它采用搜索的字符串开始和结束位置 . 返回的元组是最长的回文的开始和结束 . 我试图分裂成这些情况:

如果s [i] == s [j]调查最长(s,i 1,j-1)

调查最长(s,i 1,j)

调查时间最长(s,i,j - 1)

从这三个中返回最长(返回的开始和结束之间的最大差异)

当然我使用带有tuple(int,int)的Dictionary作为键(i和j的值)来记住所有计算结果,以便不再计算它们 .

完整代码如下,但在我尝试修复算法后几次迭代后它非常混乱 . 我相信concreate代码不是很重要 .

代码似乎返回正确的结果但在Leetcode上超过时间限制时失败 . 有正确的快速递归解决方案吗?我相信应该存在DP自下而上的解决方案 .

码:

private readonly IDictionary _mem = new Dictionary();

private (int Start, int End) Longest(string s, int i, int j) {

if (i >= j) {

return (i, j);

}

if (_mem.TryGetValue((i, j), out var ret)) {

return ret;

}

var newI = i + 1;

var newJ = j - 1;

ValueTuple removingTwo;

if (s[i] == s[j])

{

removingTwo = Longest(s, newI, newJ);

if (removingTwo.Item1 == newI && removingTwo.Item2 == newJ) {

removingTwo.Item1--;

removingTwo.Item2++;

}

}

else {

removingTwo = (1, 0);

}

var removingFirst = Longest(s, newI, j);

var removingLast = Longest(s, i, newJ);

var mT = removingTwo.Item2 - removingTwo.Item1;

var mF = removingFirst.End - removingFirst.Start;

var mL = removingLast.End - removingLast.Start;

var max = Math.Max(mT, mF);

max = Math.Max(max, mL);

ValueTuple retVal;

if (max == mT) retVal = removingTwo;

else if (max == mF) retVal = removingFirst;

else retVal = removingLast;

_mem.Add((i, j), retVal);

return retVal;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值