1. 程式人生 > >第三章結構之法--------字符串移位包含

第三章結構之法--------字符串移位包含

解法 額外 通過 字符串包含 分析 第一個字符 字符串移位 subst ext

字符串移位包含的問題

給定兩個字符串s1和s2,要求判定s2是否能夠被s1做循環移位(rotate)得到的字符串包含。

例如,給定s1=AABCD和s2=CDAA,s1可以通過向右移動兩位,s1------>BCDAA,使得s1包含s2,返回true。

而對於s1=ABCD和s2=ACBD,無論s1怎麽移動,都無法包含s2,則返回false。

分析與解法

解法1:

這一道題,一開始我並沒有想到什麽好的解題思路。首先想到的是用暴力枚舉的方法,將所有移位後字符串都

列舉出來,在進行判斷。並且移動的次數最大就是字符串的長度,之後字符串就會還原,所以只需要比較字符串的

長度次,但是這就有一個問題,字符串很長的話,效率就會非常低,不過問題解決了,在想更好的辦法,由易到難。

public class Example3_1 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("請輸入第一個字符串:");
        String s1 = scan.next();
        System.out.println("請輸入第二個字符串:");
        String s2 = scan.next();
        
        // 判斷的是否包含。
boolean flag = false; // 只需要移動s1字符串的長度次。 if(s2.length()<=s1.length()) { for(int i = 0;i<s1.length();i++) { // 用來保存每一移動後的字符串。 StringBuffer buffer = new StringBuffer(s1.substring(i,s1.length())); buffer.append(s1.substring(
0,i)); if(buffer.toString().contains(s2)) {
flag = true;
break; } } } if(flag) { System.out.println("s1可以通過移動包含s2"); } else { System.out.println("s1不可以通過移動包含s2"); } } }

解法2:

我們可以看到對S1字符串做循環移位所得到的字符串都是字符串s1s1的子字符串,如果s2可以匹配進過移動後的

s1,則s2一定可以包含在s1s1字符串上。

ABCD----->ABCDABCD

這個解法效率很高,只需要進行一次包含的判斷,就可以確定s1是否可以包含s2。只不過這裏使用了額外的字符串。

public class Example3_1 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("請輸入第一個字符串:");
        String s1 = scan.next();
        System.out.println("請輸入第二個字符串:");
        String s2 = scan.next();
        
        // 判斷的是否包含。
        boolean flag = false;
        // 只需要移動s1字符串的長度次。
        String s3 = s1+s1;
        if(s3.contains(s2))  {
            flag = true;
        }
        if(flag)  {
            System.out.println("s1可以通過移動包含s2");
        } else {
            System.out.println("s1不可以通過移動包含s2");
        }
        
    }
}

第三章結構之法--------字符串移位包含