今日头条面试题(代码题)—— 查找字符串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代码如下:
假设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); } }
相关文章推荐
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- C++代码片段01 - 字符串中查找是否有某个字符
- 写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
- 查找字符串中最长重复字符的子串
- 程序员面试题精选(37):判断字符串是否是回文字符串或者是否含有回文字符子串
- 数据结构实验之串二:字符串匹配(查看一个字符串是否为另一个字符串的子串)
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- 查找某些字符是否在另一个字符串里出现的高效算法
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- 编程面试题在线训练平台:判断字符串是否没有重复字符
- C和指针之字符串编程练习9(在参数1中查找匹配参数2额任意字符)
- 查找B字符串中出现的字符是否在A中全部出现
- js javascript 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
- js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
- 写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
- pojg2744找一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。
- js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
- [每日练习]面试题--某个短字符串中的字符是否包含在长串中
- 利用空间换时间来快速查找字符是否存在某个字符串里
- 字符串匹配算法(在字符串T中查找是否有与字符串P相同的子串)