Bootstrap

浅谈回文串问题

回文串问题是字符串类型的题目中常见的一类。在绝大多数情况下,但凡涉及字符串问题都对“暴力算法”以及dfs等形式不太友好,常见的解决思路有动态规划,而除此之外,利用自动匹配机的性质,大牛们又发明了巧妙而高效的算法。本文在涉及“回文串类型问题”的解法之上,主要罗列一些常见的解决思路。

 

最粗暴的解法:暴力法O(N^3)

首先,可能大多数人都会想到利用回文串的性质,即S = reverse(S),即对于一个字符串,如果将其倒置后仍然与原串相同,那么其为回文串。由此,我们可以得到这样的代码:

for(int size = 1; size <= s.size();++size ){

    for(int j = 0 ; j < s.size() - size + 1; ++j){

          string tmp(s.substr(j,size));

          reverse(tmp.begin(),tmp.end());

          isPd[j][j+size-1] = tmp == s.substr(j,size);

    }

}

尽管看上去非常通俗易懂,但是很可惜,基本上使用暴力法都无法通过所有测试用例,因为时间复杂度太高了。很自然,我们需要优化一下时间复杂度。

 

进阶一、通用解法:动态规划,时间复杂度O(n^2)

在之前的文章中,本人也曾提及“涉及字符串问题时,不妨先往动态规划(dynamic programming)”的方向去思考,而在处理回文串问题时,我们一样能够利用动态规划

;