java字符串回文算法(中心扩散法)

  • Post author:
  • Post category:java




java代码:

public class date_7_2_回文字符串算法 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("pls enter the String: ");
        String str1 = input.nextLine();

        String result = str1.substring(0, 1);               // 防止出现字符串只有一个元素的情况
        for (int i = 0; i < str1.length(); i++) {
            result = extend_from_center(str1, i, i, result);
            result = extend_from_center(str1, i, i+1, result);
        }
        System.out.println(result);
    }

    public static String extend_from_center(String str, Integer left_index, Integer right_index, String result) {
        while (left_index >= 0 && right_index < str.length() && str.charAt(left_index) == str.charAt(right_index)) {
            left_index--;
            right_index++;
        }
        if (right_index - left_index - 1 > result.length()) {
            result = str.substring(left_index+1, right_index);
        }

        return result;
    }
    
}




详解例子:

假如给的string是“abba”(接下来我就尽量用下标位置说明,以免混淆)

首先初始化 result = s.substring(0,1)这里是拿到下标0的数据也就是a

for loop对字符串的长度遍历每次拿到index(0,1,2,3)


第一次loop:


本次loop第一次entendFromCenter传入(abba,0,0)进行while判断,首先left大于0,right小于abba的长度,str【0】 等于str【0】,进入while,left –,right ++,再次进行while判断,left小于0,终止

此时left是-1,right是1,进行if判断,right-left-1 = 1,不大于result 的长度,结束

本次loop第二次entendFromCenter传入(abba,0,1)进行while判断,首先left大于0,right小于abba的长度,str【0】不等于str【1】,此时left是0,right是1,进行if判断,right-left-1 = 0,不大于result 的长度,结束


第二次loop:


本次loop第一次entendFromCenter传入(abba,1,1)进行while判断,首先left大于0,right小于abba的长度,str【1】 等于str【1】,进入while,left –,right ++,再次进行while判断,str【0】不等于str【2】,终止

此时left是0,right是2,进行if判断,right-left-1 = 1,不大于result 的长度,结束

本次loop第二次entendFromCenter传入(abba,1,2)进行while判断,首先left大于0,right小于abba的长度,str【1】等于str【2】,进入while,left –,right ++,再次进行while判断,str【0】等于str【3】,进入while,left –,right ++,再次进行while判断,left小于0,结束。

此时left是-1,right是4,进行if判断,right-left-1 = 4,大于result 的长度,将result 替换为str.substring(0, 3), 也就是result =“abba”,结束

第三次loop,第四次loop……

后面就差不多了,不多赘述



版权声明:本文为SRestia原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。