21xrx.com
2025-03-24 17:57:39 Monday
文章检索 我的文章 写文章
使用C++实现最短回文串转换
2023-06-26 16:11:17 深夜i     --     --
C++ 最短回文串 转换 实现 字符串处理

回文串(Palindrome)指的是正着读和反着读都一样的字符串,如“level”或“racecar”。而最短回文串转换则指将一个字符串转换成回文串的过程,要求在转换后的回文串中插入的字符总数最少。在这篇文章中,我们将介绍如何使用C++来实现最短回文串转换。

首先,我们需要确定如何判断一个字符串是否为回文串。判断方法如下:

bool isPalindrome(string s) {
  int n = s.length();
  for (int i = 0; i < n/2; i++) {
    if (s[i] != s[n-i-1])
      return false;
    
  }
  return true;
}

其中,利用字符串长度n来确定循环次数,每次比较字符串首尾字符是否相等,若全部相等则返回true,否则返回false。

接下来,我们需要找到最短回文串转换的方法。我们可以先将原字符串逆置,然后找到原字符串中以最长公共前后缀开头和结尾的位置,将剩下的部分再逆置插入到原字符串首部位置即可。

具体的方法如下:

string shortestPalindrome(string s) {
  int n = s.length();
  string s_rev = s;
  reverse(s_rev.begin(), s_rev.end());
  for (int i = n; i >= 1; i--) {
    if (s.substr(0, i) == s_rev.substr(n-i, i)) {
      return s_rev.substr(0, n-i) + s;
    }
  }
  return s;
}

其中,利用substr方法来判断最长公共前后缀,若没有,则返回原字符串。

最后,我们可以在main函数中输入测试用例来测试我们的实现:

int main() {
  string s = "abat";
  cout << shortestPalindrome(s) << endl; // 结果输出:tabat
  return 0;
}

通过逆置、判断最长公共前后缀和字符串拼接的方法,我们可以使用C++实现最短回文串转换。

  
  

评论区