给定2个字符串s1和s2,请判断s2是否为s1旋转而成,返回bool值。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
测试样例:
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
public class ReverseEqual {
public boolean checkReverseEqual(String s1, String s2) {
if(s1.length()!=s2.length()){
return false;
}
int [] strA = new int[1000];
int [] strB = new int[1000];
for(int i =0;i<s1.length();i++){
strA[s1.charAt(i)]++;
strB[s2.charAt(i)]++;
}
for(int j = 0;j<s1.length();j++){
if(strA[j] != strB[j]){
return false;
}
}
return true;
}
}
public class ReverseEqual {
/**
* 翻转子串
* 法二,优化了性能
*/
public boolean checkReverseEqual(String s1, String s2) {
// write code here
int length = s1.length();
if (length == s2.length() && length > 0) {
String s1s1 = s1 + s1;
return isSubString(s1s1,s2);
}
return false;
}
private boolean isSubString(String s1s1, String s2) {
int lengthS1s1 = s1s1.length();
if (lengthS1s1 < s2.length() || lengthS1s1 <= 0 || s2.length() <= 0) {
return false;
}
//使用contains方法,当且仅当此字符串包含s(指定的 char值序列)时,返回 true。
else if(s1s1.contains(s2)){
return true;
}
return false;
}
} 思路:将s2和自己拼接之后得到s3,看s3是否包含s1。直接使用String类的函数contains来检查是否字符串匹配。
public boolean checkReverseEqual(String s1, String s2) {
if(s1 == null || s2 == null) return false;
if(s1.length() != s2.length()) return false;
if(s1.length() == 0 && s1.length() == 0) return true;
String s3 = s2 + s2;
return s3.contains(s1);
}
看了评论才知道题目意思,对不起语文老师,话说我是来找茬的,我把它当初前面一题,两个字符串异序同构做的,竟然AC了,这测试用例,已提交纠错了,不过话说我已纠错了不下好几题了,至今没有得到反馈啊,不知道是不是我太菜,大神没空搭理我,让我哭会,
//能AC的错误代码
public boolean checkReverseEqual(String s1, String s2) {
if(s1==null||s2==null) return false;
if(s1.length()!=s2.length()) return false;
int[] hash1=new int[256];
int[] hash2=new int[256];
for(int i=0;i<s1.length();i++){
hash1[s1.charAt(i)]++;
hash2[s2.charAt(i)]++;
}
for(int j=0;j<hash1.length;j++) if(hash1[j]!=hash2[j]) return false;
return true;
}
//正确代码 方法一
public boolean checkReverseEqual(String s1, String s2) {
if(s1==null||s2==null) return false;
if(s1.length()!=s2.length()) return false;
s1=s1+s1;
return s1.indexOf(s2)==-1?false:true;
}
//同上,方法二 自己写匹配部分
public boolean checkReverseEqual(String s1, String s2) {
if(s1==null||s2==null) return false;
if(s1.length()!=s2.length()) return false;
s1+=s1;
int count=0;
for(int i=0;i<s1.length()&&count<s2.length();i++){
if(s2.charAt(count)==s1.charAt(i)) count++;
else count=0;
}
return count==s2.length()?true:false;
}
//KMP判断子串,然后s1+s1和s2比较
//(原来可以直接调用库函数啊)
import java.util.*;
public class ReverseEqual {
public boolean checkReverseEqual(String s1, String s2) {
s1+=s1;
int[] next=getNext(s2);
return KMP(s1,s2,next);
}
public boolean KMP(String s1,String s2,int[] next){
int j=0;
for(int i=0;i<s1.length();i++){
while(j>0&&s1.charAt(i)!=s2.charAt(j))
j=next[j-1];
if(s1.charAt(i)==s2.charAt(j))
j++;
if(j==s2.length())
return true;
}
return false;
}
public int[] getNext(String s){
int[] next=new int[s.length()];
next[0]=0;
int j=0;
for(int i=1;i<s.length();i++){
while(j>0&&s.charAt(j)!=s.charAt(i))
j=next[j-1];
if(s.charAt(j)==s.charAt(i))
j++;
next[i]=j;
}
return next;
}
}
import java.util.*;
public class ReverseEqual {
public boolean checkReverseEqual(String s1, String s2) {
ArrayList<String> list = new ArrayList<>();
if (!list.contains(s1)) {
list.add(s1);
for (int j = 0; j < s1.length() - 1; j ++) {
char last = s1.charAt(s1.length()-1);
s1 = s1.substring(0, s1.length()-1);
s1 = last + s1;
list.add(s1);
}
}
return list.contains(s2);
}
}
public class ReverseEqual {
public boolean checkReverseEqual(String s1, String s2) {
String s = s1 + s1;
return s.indexOf(s2) > 0;
}
}