题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解法:
首先想到的是用两个idx在string移动,然后判断这两个idx之间的string是否是回文串。暴力判断:
string longestPalindrome(string& s) { if (s.length() < 2) { return s; } int ii = 0; //如果都是相同的字符; for (; ii < s.length(); ii++) { if (s[ii] == s[0]) { continue; } break; } if (ii == s.length()) { return s; } string result = s.substr(0,1); int idx = 0, idx2 = 0; int maxSubLen = 0; //记录最长字串 while (idx <= s.length()/2) { //idx2 = idx + 1;//直接+1的方式,提交后运行超时,因为需要遍历O(n^2) idx2 = idx + maxSubLen;//判断当前 idx idx2的间距是否大于maxSubLen,如果小于则不比较; while (idx2 < s.length()) { //先判断第一个跟最后一个是否相同 if (s[idx] != s[idx2]) { idx2++; continue; } int n = (idx2 - idx + 1) / 2; int i = 0; int tmp1 = idx; int tmp2 = idx2; for (; i < n; i++) { if (s[++tmp1] != s[--tmp2]) { break; } } if (i == n)//表示 [idx ... idx2]是回文串 { if (idx2 - idx + 1 > maxSubLen) { maxSubLen = idx2 - idx + 1; result = s.substr(idx, maxSubLen); } } idx2++; } idx++; } return result; }
注意:
上面的idx2=idx+maxSubLen,如果直接用idx2=idx+1的话,提交后运行时间超过限制。。。因为当前的最长回文串的长度是maxSubLen,再判断idx,idx+1已经没有意义了,直接 idx2=idx+maxSubLen 减少判断
运行结果:
感觉还是要使用数据结构,或者什么算法,因为执行时间太慢了
题解:
TODO
动态规划等