|
发表于 2022-8-10 11:30:06
|
显示全部楼层
本帖最后由 dolly_yos2 于 2022-8-10 11:31 编辑
这个方法还是挺让人(让我)眼前一亮的,非常巧妙,只是稍微少了一点细节。
最长公共子串的条件不够充分,还要保证这一组子串来自相同的位置才是原字符串的最长回文子串。在现有基础上稍加修改(给答案更新添加一个额外的判断条件)就可以了。
用 C++ 按照 leetcode 模板写了一个版本,大概是这样的
- string longestPalindrome(string s) {
- int length[s.size()][s.size()];
- int result_position = 0;
- int result_length = 0;
- string s_rev(s.crbegin(), s.crend());
- for(int i = 0; i < s.size(); ++i) for(int j = 0; j < s_rev.size(); ++j){
- if(s[i] == s_rev[j]){
- if(i == 0 || j == 0) length[i][j] = 1;
- else length[i][j] = length[i - 1][j - 1] + 1;
- if(length[i][j] > result_length && s.size() + length[i][j] - j - 2 == i){ // 确保子串位置正确
- result_length = length[i][j];
- result_position = i;
- }
- }else{
- length[i][j] = 0;
- }
- }
- return s.substr(result_position - result_length + 1, result_length);
- }
复制代码
除了添加的一个额外判断之外和大佬的代码基本是完全等价的。 |
评分
-
查看全部评分
|