华为算法机试题-找子串,留个记念哈哈

public class SubSequeuesDemo {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入target字符串...");
		String targetStr = scanner.next();
		System.out.println("请输入source字符串...");
		String sourceStr = scanner.next();
		scanner.close();
		System.out.println("您的source字符串=" + sourceStr);
		System.out.println("您的target字符串=" + targetStr);

		char[] charArray = sourceStr.toCharArray();
		// 生成char数组
		// char[] charArray = "ffawabggacegcegergbegadfahehheeh".toCharArray();
		// 转换目标char数组
		char[] targetCharArray = targetStr.toCharArray();
		// 记录上一次找到char的临时变量
		int lastIndex = 0;
		// 记录子序第一个的下标
		int firstSourceIndex = 0;
		// 记录子序最后一个的下标
		int endSourceIndex = 0;

		int targetLastIndex = targetCharArray.length - 1;
		for (int targetIndex = targetLastIndex; targetIndex >= 0; targetIndex--) {
			char tempTargetChar = targetCharArray[targetIndex];
			// 从尾部开始遍历,减少循环次数
			for (int sourceIndex = charArray.length - 1; sourceIndex >= 0; sourceIndex--) {
				// 跳过已找到的,减少判断
				if (sourceIndex > lastIndex && lastIndex != 0) {
					continue;
				}
				char tempSourceChar = charArray[sourceIndex];
				// 先找到最好一个,再利用当前循环开始找,最后一个c找到了
				if (tempSourceChar == tempTargetChar && (lastIndex == 0 || sourceIndex <= lastIndex)) {
					lastIndex = sourceIndex;
					System.out.println("char=" + tempSourceChar + ",index=" + sourceIndex);
					if (targetIndex == targetLastIndex) {
						endSourceIndex = sourceIndex;
					} else if (targetIndex == 0) {
						firstSourceIndex = sourceIndex;
					}
					break;
				}
			}
		}

		System.out.println(firstSourceIndex);
		System.out.println("最后序列开序下标=" + firstSourceIndex);
		System.out.println("最后序列结束下标=" + endSourceIndex);
		StringBuffer stringBuffer = new StringBuffer();
		for (int i = firstSourceIndex; i <= endSourceIndex; i++) {
			stringBuffer.append(charArray[i]);
		}
		System.out.println("最后序列串=" + stringBuffer.toString());

	}

}

优化版本,修改source初始循环下标,达到节省循环的目的:

public static void main(String[] args) {
		while(true) {
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入target字符串...");
			String targetStr = scanner.next();
			System.out.println("请输入source字符串...");
			String sourceStr = scanner.next();
			System.out.println("您的source字符串=" + sourceStr);
			System.out.println("您的target字符串=" + targetStr);
			printSubStrs(targetStr, sourceStr);
		}

	}

	private static void printSubStrs(String targetStr, String sourceStr) {
		char[] charArray = sourceStr.toCharArray();
		// 生成char数组
		// char[] charArray = "ffawabggacegcegergbegadfahehheeh".toCharArray();
		// 转换目标char数组
		char[] targetCharArray = targetStr.toCharArray();
		// 记录上一次找到char的临时变量
		int lastIndex = 0;
		// 记录子序第一个的下标
		int firstSourceIndex = 0;
		// 记录子序最后一个的下标
		int endSourceIndex = 0;
		//下次循环从已找到的子串位置开始
		int sourceLength = charArray.length - 1;
		int targetLastIndex = targetCharArray.length - 1;
		for (int targetIndex = targetLastIndex; targetIndex >= 0; targetIndex--) {
			char tempTargetChar = targetCharArray[targetIndex];
			// 从尾部开始遍历,减少循环次数
			for (int sourceIndex = sourceLength; sourceIndex >= 0; sourceIndex--) {
				// 跳过已找到的,减少判断
				/*
				 * if (sourceIndex > lastIndex && lastIndex != 0) { continue; }
				 */
				char tempSourceChar = charArray[sourceIndex];
				// 先找到最好一个,再利用当前循环开始找,最后一个c找到了
				if (tempSourceChar == tempTargetChar && (lastIndex == 0 || sourceIndex <= lastIndex)) {
					lastIndex = sourceIndex;
					sourceLength = sourceIndex-1;
					System.out.println("char=" + tempSourceChar + ",index=" + sourceIndex);
					if (targetIndex == targetLastIndex) {
						endSourceIndex = sourceIndex;
					} else if (targetIndex == 0) {
						firstSourceIndex = sourceIndex;
					}
					break;
				}
			}
		}

		System.out.println(firstSourceIndex);
		System.out.println("最后序列开序下标=" + firstSourceIndex);
		System.out.println("最后序列结束下标=" + endSourceIndex);
		StringBuffer stringBuffer = new StringBuffer();
		for (int i = firstSourceIndex; i <= endSourceIndex; i++) {
			stringBuffer.append(charArray[i]);
		}
		System.out.println("最后序列串=" + stringBuffer.toString());
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值