今天在网上逛贴,天然看见一个刚刚电面过阿里的同学发上来的电面的题目,比较好奇,题目是这样的:给定一个字符串,输出其所有的连续子串,如给定字符串为abcd,则要输出其全部连续子串为:a,b,c,d,ab,bc,cd,abc,bcd,abcd,
可能大家看到这道题目,首先映入脑海的是从头到尾遍历,这是最为常规的解法,但是其复杂度我们不难分析出为O(n*n*n),显然面试管肯定不满意这种解法,
我们可以看到这是要不断循环的,于是我们想到了递归,下面是递归的基本思想:
1、刚开始,输入abcd,我们从后往前遍历,
abcd->abc->ab->a,一次递归完成
2、将原字符串的第一个字符截下,用后面的字符组成一个新的字符串,开始新的遍历,即bcd,开始新的遍历,
bcd->bc->b
3、继续下去,cd->c
4、最后是d
package programmer;
import java.util.Scanner;
public class SuccessiveString {
public void successiveString(String str) {
for (int i = str.length(); i >= 0; i--)
System.out.println(str.substring(0, i));
if (str.length() > 1)
successiveString(str.substring(1));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
new SuccessiveString().successiveString(str);
}
}
上面就是用java书写的源代码,可以分析此代码的复杂度为n*T(n)=n*(n+n-1+n-2+...+1)=O(n*n*n),显然要优化不少。
上面只是自己的拙见,希望大家多多批评指正。