私はいくつかの練習問題を実行していますが、そのうちの1つは2つの文字列を取り、私は私の最初の解決策を書いた:2つの文字列が与えられた場合、1が他の文字の部分文字列であるかどうかを再帰的に調べる
public static boolean isSubstring(String s1, String s2){
String longer = s1.length() > s2.length() ? s1 : s2;
String shorter = s1.length() < s2.length() ? s1 : s2;
String substring;
for(int i = 0; i < longer.length() && i + shorter.length() <= longer.length(); i++){
substring = longer.substring(i, i + shorter.length());
if(substring.equals(shorter))
return true;
}
return false;
}
をそして私は、JavaがStringクラスのメソッドが含まれ、その溶液は、その時点で自明である持っていることを思い出しました。 :私が練習していると私は再帰が得意じゃないので
public static boolean isSubstringUsingContains(String s1, String s2){
String longer = s1.length() > s2.length() ? s1 : s2;
String shorter = s1.length() < s2.length() ? s1 : s2;
return longer.contains(shorter);
}
、私は再帰的にこの問題を解決するために試してみてくださいと思った、と私は正確にそうすることができていません。再帰でこれをどのように解決できますか?また、上記の解法とは対照的に、ここで再帰を使用するための長所と短所があります。ここでは、この問題のための再帰的な解決策で私の失敗した試みです:
public static boolean isSubstringRecursive(String s1, String s2,int i){
if(s1.length() == 0 || s2.length() == 0)
return false;
String longer = s1.length() > s2.length() ? s1 : s2;
String shorter = s1.length() < s2.length() ? s1 : s2;
if(longer.equals(shorter))
return true;
return isSubstringRecursive(longer.substring(i,i + shorter.length()),shorter,i + 1);
}
EDIT
テストケース: 文字列A = "バットマン" 文字列B = "気圧" RESULT:真の
文字列A = "逆立ち" 文字列B = RESULT "スタンド":真の
を文字列A = "Hotsauce" 文字列B = "ECU" 結果:偽
あなたはテストケースを持っていますか? –
再帰はdiguiseのループです - 作業コードにループはありません:なぜ再帰が必要だと思いますか? – assylias
あなたの基本ケースには 'startsWith'を、再帰的には' substring(1) 'を使うことをお勧めします。長い文字列が短い文字列で始まる場合は、終了します。それ以外の場合は、最初の文字を消して再帰します。 –