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

字符串移位包含的问题

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

    }
}

原文地址:https://www.cnblogs.com/lixiaochi/p/10581244.html

时间: 2024-10-07 14:10:54

第三章结构之法--------字符串移位包含的相关文章

第3章 结构之法——字符串移位包含的问题

字符串移位包含的问题 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter3jiegouzhifa.QuestionOfStringMove; 2 /** 3 * 字符串移位包含的问题 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringMove { 9 /** 10 * 寻找移位后的字串(左移) 11 * @param src 源字符串 12 * @param des 要查找的子串 13 * @ret

程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题

#include<iostream> #include<vector> using namespace std; class stack { private: vector<int> vec;//用来保存当前进栈的值 vector<int> max_vec; public: void push(int a) { vec.push_back(a); if(max_vec.size()==0||a>vec[max_vec[max_vec.size()-1]

字符串移位包含的问题

/* * 字符串移位包含的问题 * 给定两个字符串,要求判定s2是否能够被s1叫做循环移位得到的字符串包含. * 例如给定 s1=AABCD,s2=CDAA,返回true; * 给定 S1=ABCD, s2=ABCD,返回false*/ public class QuestionAlia{ //方法 一: 利用java的 substring()及startsWith()方法 public static boolean isXunHuan(String text,String query){ fo

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

[题目] 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含.例如,S1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回false. [分析] [思路一] 从题目中可以看出,我们可以使用最直接的方法对S1进行循环移动,再进行字符串包含的判断,从而遍历其所有的可能性. 字符串循环移动,时间复杂度为O(n),字符串包含判断,采用普通的方法,时间复杂度为O(n*m),总体复杂度为O(n*n*m). 字符串包含判断,若采

CareerCup之1.8 字符串移位包含问题

[题目] 原文: 1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., "waterbottle" is a rotat

字符串移位包含的问题——解题笔记

字符串移位包含的问题--解题笔记 题目描述:给定两个字符串s1和s2,要求判定s2时候能够被s1做循环移位(rotate)得到的字符串包含.例如,给定s1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回false. solution 1: 直接的方法,把串s1遍历所有移位之后的情况,每种情况都判断一遍时候包含s2. 分析:这种情况在s1串很长的情况不好,需要遍历的情况太多. solution 2:注意到s1串移位之后会出现循环的情况,而循环也就是s1串的重复放

Openjudge-NOI题库-字符串移位包含问题

题目描述 Description 对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串. 给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串.例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串. 输入输出格式 Input/output 输入: 一行,包含两个字符串,中间由单个空格隔开.字符串只包含字母和数字,长度不超过30. 输

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

      这道题目的意思是给定一个字符串,作为源字符串,之后给出其他的字符串,确定源字符串是否能够经过旋转而得到给定的字符串,即移位包含问题.       假如,给定一个字符串 abcdefg,接着给定字符串 cdefgab,很显然,给定的字符串是可以经过源字符串旋转而得到的,但是,给定字符串 cdegfab 就不能由源字符串经过旋转而得到.       当然,这道题有很多解法,我们可以经过判断字符串中字符的位置而得到答案,但是,那样做确实是太麻烦了,有更好的解法吗?当然,我们看下两个字符串的

第3章 结构之法——计算字符串的相似度

计算字符串的相似度 问题描述 分析与解法 具体代码如下: 1 package chapter3jiegouzhifa.StringSimilarity; 2 /** 3 * 计算字符串的相似度 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringSimilarity { 9 public static int CalculateStringDistance(String str1, int b1, int e1, String str