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。
扫描二维码关注公众号,回复:
9925439 查看本文章
上代码:
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));
}
}