2

私は最近インターンシップの面接を受けた大学生です。私に求められたことの 1 つは、2 つの文字列を入力として取り、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 の現在のインデックスと等しいかどうかを確認し、等しい場合は、両方を逆方向にループして正確に一致するかどうかを確認します。

このソリューションで私が気に入っている 2 つの点は、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 に答える