给定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; } }