第三章结构之法--------字符串移位包含

Posted lixiaochi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三章结构之法--------字符串移位包含相关的知识,希望对你有一定的参考价值。

字符串移位包含的问题

给定两个字符串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");
        }
        
    }
}

 

以上是关于第三章结构之法--------字符串移位包含的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode题解——数据结构之字符串

《构建之法(第三版)》第四章

2018--20179215--《构建之法(第三版)》第四章 两人合作

构建之法读后感_2

编程之美----字符串移位包含的问题

阅读构建之法读后感第三章