2

我是一名大学生,最近接受了实习职位的面试。要求我做的一件事是编写一个将两个字符串作为输入的方法,如果第二个参数是第一个参数的子字符串,则返回 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() > s1.length(),循环将不会执行,并且该方法将返回 false,而且它不必检查 s1 中的每个字符以找到答案。

在可读性、方法论、更好的编程实践等方面我可以做些什么改进?

4

3 回答 3

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

于 2013-05-07T13:58:38.117 回答
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;
}
于 2013-10-24T20:29:37.837 回答
0

建议看看String.contains(CharSequence src) src是怎么实现的,应该不错

于 2013-05-07T13:41:37.173 回答