您的位置:首页 > 职场人生

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

2017-04-12 22:13 513 查看
题目要求:给定字符串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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐