我是一名大学生,最近接受了实习职位的采访。我要问的一件事就是编写一个方法,它将两个字符串作为输入,如果第二个参数是第一个的子字符串,则返回true。我上交的答案对我来说并不令人满意,所以当我开车回家时,我想到了以下解决方案:
// containsSubstring(s1,s2) returns true if the string s2 is contained within s1
public static boolean containsSubstring(String s1, String s2) {
if(s2.length()==0 && s1!=null)
return true;
for(int i=s2.length()-1;i<=s1.length()-1;i++) {
if(s2.charAt(s2.length()-1) == (s1.charAt(i))) {
int k=i;
for(int j=s2.length(); j>0;j--) {
if(s1.charAt(k) != s2.charAt(j-1))
j=-1; // exits loop.
else if (j == 1)
return true;
else
k--;
}
}
}
return false;
}
此代码基本上检查s2的最后一个字符是否等于s1的当前索引,如果是,则向后循环以查看它们是否完全匹配。
我喜欢这个解决方案的两件事是,如果s2.length()&gt; s1.length(),循环不会执行,方法只会返回false,而且它不必检查s1中的每个字符来找到答案。
我在可读性,方法,更好的编程实践等方面是否有任何改进?
答案 0 :(得分:0)
我建议看一下String.contains(CharSequence src)src是如何实现的,应该是好的
答案 1 :(得分:0)
我会这样做:
public static boolean containsSubstring(String s1, String s2) {
if(s2.length()==0 && s1!=null)
return true;
for(int i=0; i < s1.length() - s2.length() + 1; i++) {
int k = 0;
while (k < s2.length() && s1.charAt(k+i) == s2.charAt(k++));
if (k == s2.length() && s1.charAt(k+i-1) == s2.charAt(k-1)) return true;
}
return false;
}
您可以在此处进行测试:http://ideone.com/PwEaf4
答案 2 :(得分:0)
我更愿意使用以下方式。
private boolean isSubString(String s1, String s2) {
if(s1==null && s2==null) return true;
else if (s1== null) return false;
else if (s2 == null) return true;
char[] a1 = s1.toCharArray();
char[] a2 = s2.toCharArray();
int l1 = s1.length();
int l2 = s2.length();
int i=0;
while(i<l1) {
int j=0;
while(j<l2 && i<l1 && a1[i]==a2[j]){
i++;
j++;
if(j==l2) {
return true;
}
}
i++;
}
return false;
}