C++基础(三)判断回文串--中心扩散法

   日期:2021-03-11     浏览:176    评论:0    
核心提示:判断回文字符串一种是暴力检索另外一种则是中心扩散法暴力搜索法:从字符串的开始和末尾处标定一个点后,依次向后向前检索,并判断前后检索的字符串是否相同bool isPalindrome(string s) { if (s.size() == 0) return true; int start = 0, end = s.size() - 1; while (start <= end) { if (s[st

判断回文字符串

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

暴力搜索法:
从字符串的开始和末尾处标定一个点后,依次向后向前检索,并判断前后检索的字符串是否相同
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是回文串

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服