【问题标题】:Longest palindromic substring missing an edge case缺少边缘情况的最长回文子串
【发布时间】:2020-12-04 17:44:18
【问题描述】:

这是我使用动态编程概念编写的代码。

bool ispalin(string s)
    {
        string s1=s;
        reverse(s.begin(),s.end());
        if(s1.compare(s)==0)
            return true;
        return false;
    }
    string longestPalindrome(string s) {
       int n = s.length();
        if(n==1)
            return s;
       
        vector<vector<int>> dp(n,vector<int>(n,0));
        pair<int,int>coor;
        for(int i =0;i<n;i++)
        {
            dp[i][i]=1;
            coor=make_pair(i,i);
        }
        for(int i=0;i<n;i++)
        {
            int j=i+1;
            if(j<n)
            {
                if(ispalin(s.substr(i,j)))
                   {
                       dp[i][j]=1;
                       coor=make_pair(i,j);
                   }
                   else
                   {
                       dp[i][j]=0;
                   }
            }
        }
        for(int i=0;i<n;i++)
       {
            for(int j=2;j<n;j++)
            {
                if(i<j)
                {
                    if(s[i]==s[j] && dp[i+1][j-1]==1)
                    {
                        dp[i][j]=1;
                        coor=make_pair(i,j);
                    }
                    else
                        dp[i][j]=0;
                }
            }
       }
        return s.substr(coor.first,coor.second);
                   
    }

我尝试做的是

  1. 第一个 for 循环是填充对角线元素。
  2. for 循环用于填充长度为 2 的元素,即 - 我检查该子字符串是否为回文,如果是,我将其设为 1,否则设为 0。
  3. 每当我将单元格更新为 1 时,我都会将 coor 对存储到这些坐标,以便它们始终具有更新 1 的最新值。

它不适用于案例“bb”、“ccc”我怎么在代码中错过了这个案例?

【问题讨论】:

  • 我怎么会在代码中遗漏这个案例?-- How to debug small programs
  • 大声感谢@PaulMcKenzie 没有解决我的问题,但明白你的意思我会再试一次
  • 是的,使用调试器并查看那些失败的测试用例在代码中采用的路径与您预期的不同。

标签: c++ algorithm dynamic-programming palindrome


【解决方案1】:

您使用 substr 函数的方式不正确。第一个参数应该是起始索引,第二个参数是字符串的长度。

您的代码对于此字符串也必须失败,“abccbdf”。

改变

if(ispalin(s.substr(i,j)))

到这里

if(ispalin(s.substr(i,2)))

并且,在最后一个 return 语句中,您的“coor”具有正确的值,但“substr”第二个参数不正确。 请改用此语句:

return s.substr(coor.first,coor.second-coor.first+1);

【讨论】:

  • 我进行了更改,但对于“aaaa” o/p- “aaa” 和 “aaaaa” o/p- “aaa” 的情况,代码仍然失败
  • 如果你能帮助我解决这个问题会很棒
  • 没关系,我发现我必须遍历更新单元格的错误:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多