今日头条面试题(代码题)—— 查找字符串B的字符任意一种组合是否是字符串A的子串

本文介绍了一种高效的字符串匹配算法,用于判断字符串A是否包含字符串B所有字符的任意组合。通过使用HashSet来跟踪B中的字符,并在A中进行遍历检查,实现了快速匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:给定字符串A,B,其中B字符串不包含重复字符。

  假设A="adcaaabcab",  B="abc", 可知B中包含的字符的所有组合方式有以下6种:abc acb bac bca cab cba;只要A字符串的某个子串是以上6种情况种的任何一种,返回true(就像例子中这样,A字符串有一个子串是“abc”,所以返回true), 如果这6种组合方式都不是A的某个子串,返回false。要是时间复杂度要足够低。


思路:首先肯定不能使用穷举B中字符组合的方式,因为显然这种的时间复杂度会很高。所以不必深想就可以否决这个方案。

           后来想到的思路是:用set保存B字符串的所有字符,然后遍历A字符串,如果当前正处理的字符在set中,将该字符从set中删除,接着判断A的下一个字符,如果这个字符也在set中,继续判断下一个字符....如果A的下一个字符不在set中,也就是说前一个字符开始的A的子串并不只包含B中的字符,因此该子串不符合条件。接下来就需要将set重置为初始状态(因为set可能已经删掉了某些数据,重置set也就是让set再次包含B的所有字符,重新开始判断),然后从当前位置重新开始判断。


Java代码如下:

import java.util.HashSet;

public class Solution {

	public static boolean isFound(String aStr, String bStr) {
		// 参数检查
		if (aStr == null || bStr == null) {
			return false;
		}
		if (bStr.length() == 0) {
			return false;
		}

		// 使用一个set保存bStr中的各个字符
		HashSet<Character> set = new HashSet<Character>();
		for (int i = 0; i < bStr.length(); i++) {
			set.add(bStr.charAt(i));
		}
		// set的备份
		HashSet<Character> setBak = new HashSet<Character>(set);
		boolean isFind = false;
		for (int i = 0; i < aStr.length(); i++) {
			char current = aStr.charAt(i);
			if (!set.isEmpty()) {
				if (set.contains(current)) {
					set.remove(current);
					isFind = true;
					if(set.isEmpty()){
						return true;
					}
				} else {
					if (isFind) {
						set = new HashSet<Character>(setBak);
						i--;
					}
					isFind = false;
				}
			} else {
				return true;
			}
		}
		return false;
	}

	public static void main(String[] args) {
		String aStr = "aaabcdgedewf";
		String bStr = "abcd";
		boolean flag = Solution.isFound(aStr, bStr);
		System.out.println(flag);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值