Manacherアルゴリズムの簡単な実装

/**
 * @author: 1298509345
 * date: 2020/8/23
 * Time: 20:34
 * Describe:
 */
public class Main2 {
    
    

  static char[] manacherStr(String str) {
    
    
    char[] chars = str.toCharArray();
    char[] ret = new char[chars.length * 2 + 1];
    int idx = 0;
    for (int i = 0; i < ret.length; i++) {
    
    
      ret[i] = (i & 1) == 0 ? '#' : chars[idx++];
    }
    return ret;
  }

  static String lps(String str) {
    
    
    char[] chars = manacherStr(str);
    int[] pRadius = new int[chars.length];
    int C = -1, maxR = -1;
    int begin = -1, len = 0;
    for (int i = 0; i < chars.length; i++) {
    
    
      pRadius[i] = maxR > i ? Math.min(pRadius[2 * C - i], maxR - i) : 1;
      while (i - pRadius[i] >= 0 && i + pRadius[i] < chars.length) {
    
    
        if (chars[i - pRadius[i]] == chars[i + pRadius[i]]) pRadius[i]++;
        else break;
      }
      if (i + pRadius[i] > maxR) {
    
    
        C = i;
        maxR = i + pRadius[i];
      }
      if (pRadius[i] > len) {
    
    
        begin = i - (pRadius[i] - 1);
        len = pRadius[i] - 1;
      }
    }
    return begin == -1 ? "" : new String(chars).substring(begin, begin + 2 * len).replaceAll("#", "");
  }

  public static void main(String[] args) throws IOException {
    
    
    String str1 = "babad";
    System.out.println(lps(str1));
  }

}

おすすめ

転載: blog.csdn.net/qq_42007742/article/details/108854302
おすすめ