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;
}
中心扩散法:
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是回文串

C++基础(三)判断回文串--中心扩散法_第1张图片

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)相等即可

你可能感兴趣的:(C++,分割字符串,中心扩散法,c++,字符串,算法)