第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      * @return
14      */
15     public static boolean findSubStr(String src1, String des){
16         char[] src = src1.toCharArray();
17         int n = src.length;
18         for(int i=0;i<n;i++){
19             StringBuffer sb = new StringBuffer();  //用于存放移位后的字符串
20             char temp = src[0];
21             for(int j=0;j<n-1;j++){
22                 src[j] = src[j+1];
23                 sb.append(src[j+1]);
24             }
25             src[n-1] = temp;
26             sb.append(temp);
27             //判断是否包含
28             if(sb.toString().contains(des))
29                 return true;
30         }
31         return false;
32     }
33     public static void main(String[] args) {
34         String src = "AABCD";
35         String des = "CDAA";
36         if(findSubStr(src,des))
37             System.out.println("可以通过循环移位得到!");
38         else
39             System.out.println("不可以通过循环移位得到!");
40     }
41
42 }

程序运行结果如下:

可以通过循环移位得到!

【解法二】

这种解法存在一个bug:s1="A", s2="AA". 解决办法:先比较一下长度。

具体代码如下:

 1 package chapter3jiegouzhifa.QuestionOfStringMove;
 2 /**
 3  * 字符串移位包含的问题
 4  * 【解法二】
 5  * @author DELL
 6  *
 7  */
 8 public class StringMove2 {
 9     /**
10      * 寻找移位后的字串(左移)
11      * @param src 源字符串
12      * @param des 要查找的子串
13      * @return
14      */
15     public static boolean findSubStr(String src, String des){
16         if(src.length()<des.length())
17             return false;
18         StringBuffer sb = new StringBuffer();
19         sb.append(src);
20         sb.append(src);
21         //判断是否包含
22         if(sb.toString().contains(des))
23             return true;
24         else
25             return false;
26     }
27     public static void main(String[] args) {
28         String src = "AABCD";
29         String des = "CDAA";
30         if(findSubStr(src,des))
31             System.out.println("可以通过循环移位得到!");
32         else
33             System.out.println("不可以通过循环移位得到!");
34     }
35
36 }

程序运行结果如下:

可以通过循环移位得到!

总结

  第二种方法利用了“提高空间复杂度来换取时间复杂度的降低”的思路,适用于对时间复杂度要求高的场合。

时间: 2024-12-22 11:02:05

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

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

字符串移位包含的问题 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含. 例如,给定s1=AABCD和s2=CDAA,s1可以通过向右移动两位,s1------>BCDAA,使得s1包含s2,返回true. 而对于s1=ABCD和s2=ACBD,无论s1怎么移动,都无法包含s2,则返回false. 分析与解法 解法1: 这一道题,一开始我并没有想到什么好的解题思路.首先想到的是用暴力枚举的方法,将所有移位后字符串都 列举出来,在进行判断.并且移动的次

程之美第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]

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

[题目] 给定两个字符串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串的重复放

字符串移位包含的问题

/* * 字符串移位包含的问题 * 给定两个字符串,要求判定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

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