多次删除字符后检查字符串是否为回文?

时间:2015-06-04 18:56:39

标签: algorithm

所以,我正在解决以下问题:

http://codeforces.com/problemset/problem/276/B

现在,我想到的逻辑如下:

  1. 检查字符串是否已经是回文。
  2. 如果是,请先打印并打破。
  3. 如果没有,则调用删除功能。
  4. 检查字符串是否已经是回文。
  5. 如果是,请打印第二个并打破
  6. 其他呼叫删除功能。
  7. 继续执行步骤1-6,直到我们遇到特定的break语句。

    其中remove函数如下:

    string rm (string s)
    {
        int len = s.length();
        int l=0,r=len-1;
        while (l < r)
        {
            if (s[l] != s[r])
            {
                s.erase(l,1);
                //l++;
                //r--;
                break;
            }
            l++;
            r--;
        }
        return s;
    }
    

    基本上,它会从结尾查找字符串中的第一个不匹配项,并删除该字符。 (因为两位球员都发挥得最好)

    现在,我在其中一个测试用例中获得了一个WA,其中字符串很长(这么长,以至于我不能在这里写)。我阅读了社论,那里的逻辑与我的不同,我理解这一点。但是,我只是想知道我的逻辑中是否有任何错误。我的代码可能有一些错误,但我只是想知道我的逻辑是对还是错。

3 个答案:

答案 0 :(得分:1)

注意玩家可以重新排序字母,因此

abcdcdba

已经是胜利的情况(重新订购 - &gt; abcddcba)。

答案 1 :(得分:0)

您的算法不会检测到由1个字符组成的最短回文。

答案 2 :(得分:0)

如果字符串中出现奇数个字母的奇数,则第一个玩家获胜。否则,第二位选手获胜。

string whichPlayerWins(string s) {
    int len = s.length();
    int counts[26] = { [0 ... 25 ] = 0 };
    int i;
    for (i = 0; i < len; i++) 
        counts[s[i] - 'a']++;
    int numOdd = 0;
    for (i = 0; i < 26; i++) {
        if (counts[i] % 2 == 1) numOdd++; 
    }
    if (numOdd % 2 == 1) return "First";
    else return "Second";
}