当前位置:   article > 正文

从零开始的CPP(23)动态规划解决最长回文串

从零开始的CPP(23)动态规划解决最长回文串

 leetcode5

给你一个字符串 s,找到 s 中最长的 

回文串

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

最开始我是将回文串都存入map。使用substr进行切割,i为起始,j-i+1是步长

  1. string longestPalindrome(string s) {
  2. if (s.length() <= 1) {
  3. return s;
  4. }
  5. map<int,string> resultmap;
  6. string temp;
  7. for (int i = 0; i < s.length() - 1; i++) {
  8. for (int j = i; j < s.length(); j++) {
  9. //cout << "temp:" << temp << endl;
  10. string s1 = s.substr(i, j-i+1);
  11. temp = s1;
  12. reverse(temp.begin(), temp.end());
  13. //cout << "s1:" << s1 << endl;
  14. if (temp == s1) {
  15. resultmap[i] = s1;
  16. //cout << "s1:" << s1 << endl;
  17. }
  18. }
  19. }
  20. int length = 0;
  21. int index = 0;
  22. for (int i = 0; i < resultmap.size(); i++) {
  23. if (resultmap[i].length() > length) {
  24. length = resultmap[i].length();
  25. index = i;
  26. }
  27. }
  28. return resultmap[index];
  29. }

优化了一下,还是时间复杂度

  1. string longestPalindrome(string s) {
  2. if (s.length() <= 1) {
  3. return s;
  4. }
  5. //map<int,string> resultmap;
  6. string temp;
  7. int max = 0;
  8. string maxstr;
  9. for (int i = 0; i < s.length() - 1; i++) {
  10. for (int j = i; j < s.length(); j++) {
  11. string s1 = s.substr(i, j - i + 1);
  12. temp = s1;
  13. if (s1.length() > max){
  14. reverse(temp.begin(), temp.end());
  15. //cout << "s1:" << s1 << endl;
  16. //cout << "temp:" << temp << endl;
  17. if (temp == s1) {
  18. maxstr = s1;
  19. max = s1.length();
  20. //cout << "s1:" << s1 << endl;
  21. }
  22. }
  23. }
  24. }
  25. return maxstr;
  26. }

最终还是用动态规划的方式解决。动态规划的核心思想把已经发生过的情况储存起来,需要时直接调用,也就是空间换时间。

dp存储了某一段字符串是否是回文串,dp[i][j]的值如果为true表示字符串s中从下标i到下标j的子串是一个回文串;如果为false,则不是回文串。

动态规划需要递推,所以也需要初始化,这里需要初始化单个字符串与连续字符串的情况,之后递推。

  1. string longestPalindrome(string s) {
  2. int n = s.length();
  3. if (n <= 1) {
  4. return s;
  5. }
  6. vector <vector<bool>> dp(n, vector<bool>(n, false));
  7. for (int i = 0; i < s.length(); i++) {
  8. dp[i][i] = true;
  9. }
  10. for (int i = 0; i < s.length()-1; i++) {
  11. if (s[i]==s[i+1])
  12. {
  13. dp[i][i+1] = true;
  14. dp[i+1][i] = true;
  15. }
  16. }
  17. int index=0;
  18. int maxlen=0;
  19. for (int len = 1; len < s.length(); len++) {
  20. for (int j = 0; j + len < s.length(); j++) {
  21. //cout << s[j] << endl << s[j + len]<<endl;
  22. if (s[j] == s[j + len] && dp[j + 1][j + len - 1]==true) {
  23. dp[j][j + len] = true;
  24. dp[j+len][j] = true;
  25. index = j;
  26. maxlen = len;
  27. cout << "找到回文" << ":";
  28. cout << index << "," << maxlen;
  29. }
  30. }
  31. }
  32. string res = s.substr(index, maxlen+1);
  33. return res;
  34. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/882962
推荐阅读
相关标签
  

闽ICP备14008679号