阿里实习生电面题目:输出给定字符串的全部连续子串 这是我的感悟


今天在网上逛贴,天然看见一个刚刚电面过阿里的同学发上来的电面的题目,比较好奇,题目是这样的:给定一个字符串,输出其所有的连续子串,如给定字符串为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),显然要优化不少。

上面只是自己的拙见,希望大家多多批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值