lsmCC 发表于 2024-1-28 19:39:16

运行超时,优化代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s,a,b;
    cin>>s;
    a=s;
    do
    {
      b=s;
      reverse(s.begin(),s.end()); //将s翻一下
      if(s!=a&&b==s)
      {
            cout<<s<<endl;
            return 0;
      }
      
    }while(next_permutation(s.begin(),s.end()));
    cout<<"-1"<<endl;
   
}

FishC 发表于 2024-1-28 19:40:06

这段代码是为了判断一个字符串是否为回文数。目前的问题是运行超时,可以尝试优化一下代码。

首先,你可以将翻转字符串的操作放到循环外面,这样可以减少每次循环中的重复计算。

另外,你可以使用双指针来判断是否为回文数,而不是每次都调用`reverse`函数。双指针从字符串的两端开始向中间移动,如果遇到不相等的字符,则不是回文数。

下面是优化后的代码:

#include <iostream>
#include <string>
using namespace std;

bool isPalindrome(string s) {
    int left = 0;
    int right = s.length() - 1;
   
    while (left < right) {
      if (s != s) {
            return false;
      }
      left++;
      right--;
    }
   
    return true;
}

int main() {
    string s;
    cin >> s;
   
    string reversed = s;
    reverse(reversed.begin(), reversed.end()); // 将s翻一下
   
    if (s != reversed && isPalindrome(s)) {
      cout << "是回文数" << endl;
    } else {
      cout << "不是回文数" << endl;
    }
   
    return 0;
}

这样,代码应该会更快地运行并避免超时的情况发生。如果还有问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

zhangjinxuan 发表于 2024-1-28 20:09:11

这个问题可能是给你一个字符串,是否可以通过字符重组得到一个回文串,这个代码需要枚举每一个字符串的排列,大概会执行 |S|! 次运算。

你可以这样想,偶数次数出现的字符你可以分别放在字符串的两边(放在两边的字符数量相等),奇数次数出现的话,可以通过减去一个字符变成偶数,然后继续这么做,最后剩下的一个放在字符串的最中间。

如果奇数次数出现的字符有两个及其以上,就说明无解。

可以自己写一写,如果写不对再来问。
页: [1]
查看完整版本: 运行超时,优化代码