美文网首页
214. Shortest Palindrome

214. Shortest Palindrome

作者: Ysgc | 来源:发表于2020-11-03 15:09 被阅读0次

    Given a string s, you can convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

    Example 1:

    Input: s = "aacecaaa"
    Output: "aaacecaaa"
    Example 2:

    Input: s = "abcd"
    Output: "dcbabcd"

    Constraints:

    0 <= s.length <= 5 * 104
    s consists of lowercase English letters only.

    // brute force
    class Solution {
    public:
        string shortestPalindrome(string s) {
            string r(s.rbegin(), s.rend());
            int length = s.size();
            for (int i=0; i<length; ++i) {
                if (s.compare(0, length-i, r, i, length-i) == 0) {
                    return r+s.substr(length-i, i);
                }
                // cout << i << endl;
            }
            return "";
        }
    };
    

    Runtime: 12 ms, faster than 28.67% of C++ online submissions for Shortest Palindrome.
    Memory Usage: 7.4 MB, less than 9.70% of C++ online submissions for Shortest Palindrome.


    https://www.geeksforgeeks.org/reverse-a-string-in-c-cpp-different-methods/

    https://www.cnblogs.com/grandyang/p/4523624.html

    https://www.youtube.com/watch?v=GTJr8OvyEVQ

    https://www.cnblogs.com/grandyang/p/6992403.html

    class Solution {
    public:
        string shortestPalindrome(string s) {
            string r(s.rbegin(), s.rend());
            int length = s.size();
            vector<int> next = BuildNext(s, length);
            
            int i = 0, j = 0;
            while (i < length) {
                if (r[i] == s[j]) {
                    //match
                    ++i;
                    ++j;
                }
                else if (j == 0) {
                    ++i;
                }
                else {
                    j = next[j];
                }
            }
            
            return r + s.substr(j, length-j);
        }
        
        vector<int> BuildNext(const string& s, const int& length) {
            vector<int> next(length, 0);
            int i = 1, j = 0;
            while (i < length-1) {
                if (s[i] == s[j]) {
                    // match
                    ++i;
                    ++j;
                    next[i] = j;
                }
                else if (j == 0) {
                    ++i;
                }
                else {
                    j = next[j];
                }
            }
         
            return next;
        }
    };
    

    Runtime: 4 ms, faster than 94.27% of C++ online submissions for Shortest Palindrome.
    Memory Usage: 7.6 MB, less than 9.70% of C++ online submissions for Shortest Palindrome.

    KMP 算法:

    • 第一步:建立next库
      • init pattern长度的vector=0
      • j=0, i=1 左指针,右指针
      • while i<length-1 (最后一位不用考虑)
        • if match
          • next[i+1] = j+1; 因为i+1是对应了next里面的位置,如果当前mismatch需要回到的pattern的index,j+1是因为j th已经match了,所以只需要从j+1的pattern开始和原始string对比match
          • ++i; ++j;
        • if not match
          • if j ==0 ~> ++i(默认next[i+1] = 0)
          • if j != 0 ~> j = next[j]
    • 第二步:匹配r和s, r作为原始string,s作为pattern,匹配到r匹配完毕为止
      • i=0是r的index, j=0是s的index
      • while i<length
        • if match
          • ++i; ++j; 不需要更新next
        • if not match 类似上面的逻辑
          • if j ==0 ~> ++i(默认next[i+1] = 0)
          • if j != 0 ~> j = next[j]
    • 最后输出的时候,r全部输出,附加jth 的s以及后面的整个string。不用j+1th是因为最后一步的match肯定成立,r[-1]肯定等于s[0], 所以++j已经把j右移到不确定匹配与否的index上了。

    相关文章

      网友评论

          本文标题:214. Shortest Palindrome

          本文链接:https://www.haomeiwen.com/subject/mbpvvktx.html