C++判断回文串--中心扩散法

判断回文字符串

一种是暴力检索
另外一种则是中心扩散法

暴力搜索法:
从字符串的开始和末尾处标定一个点后,依次向后向前检索,并判断前后检索的字符串是否相同
bool isPalindrome(string s) 
{
        if (s.size() == 0) return true;
        int start = 0, end = s.size() - 1;
        while (start <= end)
         {
            if (s[start] != s[end])
                return false;
            start++;
            end--;
        }
        return true;
}
中心扩散法:
利用双指针去线性扫描一遍 [i, j] 判断是否回文。我们先预处理除所有的 rec[i][j],rec[i][j] 代表 字符串s的[i, j] 这一段是否为回文串。是则为true,不是则为false,
注意:一开始我们初始化rec需要全部设置为false。
思路:以下图为例,
1.单个字符串一定是回文串,那么接着判断相邻的两个字符串,很简单只要相邻两个字符相同,
则一定是回文串。
2.接着判断三个即三个以上的字符串,以cbc为例,两个c指针分别为i,j,
此时需要有前提就是这两个位置的字符首先得相同即s[i] == s[j],
其次判断rec[i][j]是不是回文串只需要看[i + 1][j - 1]之间的字符串,即指针分别往中间移一位,此时若[i+1][j-1]之间是回文串,
则[i][j] 之间就一定是回文串,cbc,c==c,若两个c之间是回文串,则cbc是回文串
同样道理字符串cccc,c=s[i] == s[j]=c,指针往中间移[i + 1][j - 1]之间的cc是回文串,所以[i]和[j]之间的cccc是回文串

图片演示

void GetRec(vector<vector<bool>>& rec, string& s) {
        for (int j = 0; j < s.size(); j++) {
            rec[j][j] = true;//单个字符串一定是回文串
            if (j != 0) 
                rec[j - 1][j] = s[j - 1] == s[j];
            for (int i = 0; i < j - 1; i++) {
                if (s[i] == s[j])
                    rec[i][j] = rec[i + 1][j - 1];//中心扩散法判断回文字符串
                else
                    rec[i][j] = false;
            }
        }
    }

注:若被判断的数x为整型数据,那么还有一种更简单的方法判断,只需要让x与他的反数reversed(x)相等即可
代码如下:


class A {
public: bool huiwenchuan(int x) {
    int temp = 0;
    long reversed = 0;
    while (x != 0) {
        temp = x % 10;
        reversed = reversed * 10 + temp;
        x = x/10;
    }
    if (reversed >= INT_MAX || reversed <= INT_MIN) {
        reversed = 0;
    }
    if(reversed==x){
    return true;
          }
    else{
    return false;
         }



};
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值