1.CheckSubstring
給定一個輸入字符串、一個非空的子字符串 subs 和一個非負數 n。
遞歸計算並返回 true, 前提是當且僅當字符串中出現至少n個sub副本 (可能有重疊)時,才返回 true。
tips:
禁止使用循環(不要在代碼的任何地方寫 for 後者 while、do while)
禁止使用任何正則表達式和方法,例如 matches、 split, replaceAll,僅可以使用String的基本方法如charAt、toCharArray、subString等
測試用例:
@Test
public void testCheckSubstringTrue() {
String input = "abcxxxxabc";
String subs = "abc";
int n = 2;
boolean expected = true;
assertEquals(expected, CheckSubstring.checkSubstring(input, subs, n));
}
@Test
public void testCheckSubstringFalse() {
String input = "abcxxxxabc";
String subs = "abc";
int n = 3;
boolean expected = false;
assertEquals(expected, CheckSubstring.checkSubstring(input, subs, n));
}
@Test
public void testCheckSubstringOverlap() {
String input = "ababaxxxaba";
String subs = "aba";
int n = 3;
boolean expected = true;
assertEquals(expected, CheckSubstring.checkSubstring(input, subs, n));
}
// add more test cases
@Test
public void testEmptyInput() {
assertEquals(true, CheckSubstring.checkSubstring("", "a", 0));
assertEquals(false, CheckSubstring.checkSubstring("", "a", 1));
assertEquals(false, CheckSubstring.checkSubstring("", "a", 2));
}
@Test
public void testOneCharInput() {
assertEquals(true, CheckSubstring.checkSubstring("a", "a", 0));
assertEquals(true, CheckSubstring.checkSubstring("a", "a", 1));
assertEquals(false, CheckSubstring.checkSubstring("a", "a", 2));
}
@Test
public void testIotalvap() {
assertEquals(true, CheckSubstring.checkSubstring("aaaaaa", "a", 5));
assertEquals(true, CheckSubstring.checkSubstring("aaaaaa", "a", 6));
assertEquals(false, CheckSubstring.checkSubstring("aaaaaa", "a", 7));
assertEquals(true, CheckSubstring.checkSubstring("aaaaaa", "aa", 4));
assertEquals(true, CheckSubstring.checkSubstring("aaaaaa", "aa", 5));
assertEquals(false, CheckSubstring.checkSubstring("aaaaaa", "aa", 6));
}
@Test
public void testNoSubs() {
assertEquals(true, CheckSubstring.checkSubstring("fexfe", "ef", 0));
assertEquals(false, CheckSubstring.checkSubstring("fexfe", "ef", 1));
}
遞歸調用做,上代碼:
public static boolean checkSubstring(String input, String subs, int n) {
// base case
if(input.length()<subs.length()) {
if(n>0) return false;
else return true;
}
// recursive step
if(input.substring(0,subs.length()).equals(subs)) {
return checkSubstring(input.substring(1), subs, n-1);
}else {
return checkSubstring(input.substring(1), subs, n);
}
}
2.CountBabaMama
給定一個字符串,編寫一個遞歸返回輸入字符串 中“baba”或“mama”子字符串出現次數的方法。
它們可能重疊。 不要在代碼中使用任何循環。 不要使用任何正則表達式和方法,如 matches、 split、replaceAll。
上代碼:
public static int countBabaMama(String input) {
// base case
int count = 0;
if(input==null||input.equals("")||input.length()<=3) return 0;
if(input.length()==4) {
if(input.equals("baba")||input.equals("mama")) return 1;
else return 0;
}
// recursive step
if(input.substring(0,4).equals("baba")||input.substring(0,4).equals("mama")) count = 1;
return count+countBabaMama(input.substring(1));
}
3.DelDuplicate
給定一個輸入字符串,遞歸地刪除所有重複的相 鄰字符並返回一個字符串,其中所有相同的相鄰 字符都被縮減爲一個字符。
不要使用任何循環。 不要使用任何正則表達式和方法,如 matches、 split、replaceAll。
上代碼:
public static String delDuplicate(String input) {
if(input==null||input.equals("")||input.length()==1) return input;
if(input.substring(0,1).equals(input.substring(1,2))) {
return delDuplicate(input.substring(1));
}else {
return input.substring(0,1)+delDuplicate(input.substring(1));
}
}