改进我的Java方法containsSubstring(s1,s2),它查找s2是否为s1的子串

时间:2013-05-07 13:18:45

标签: java string optimization substring

我是一名大学生,最近接受了实习职位的采访。我要问的一件事就是编写一个方法,它将两个字符串作为输入,如果第二个参数是第一个的子字符串,则返回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中的每个字符来找到答案。

我在可读性,方法,更好的编程实践等方面是否有任何改进?

3 个答案:

答案 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;
}