给一个非常长的字符串str 另一个字符集比方{a,b,c} 找出str 里包括{a,b,c}的最短子串。要求O(n)
2015-01-20 11:31
337 查看
给一个非常长的字符串str 另一个字符集比方{a,b,c} 找出str 里包括{a,b,c}的最短子串。要求O(n).
比方,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc。
设置Front和Rear,使用对象记录字符集已有值的个数和位置,通过Front和Rear遍历字符串。
遍历过程为Rear在前,当遇到字符集中字符时,该字符个数加1,记录该字符位置。
出现字符集都出现时,计算字串长度;然后,front前移一位,假设此位在字符集中,清空对象记录字符集的状态。
最后获得字串的最小长度和字串位置。
比方,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc。
设置Front和Rear,使用对象记录字符集已有值的个数和位置,通过Front和Rear遍历字符串。
遍历过程为Rear在前,当遇到字符集中字符时,该字符个数加1,记录该字符位置。
出现字符集都出现时,计算字串长度;然后,front前移一位,假设此位在字符集中,清空对象记录字符集的状态。
最后获得字串的最小长度和字串位置。
import java.util.HashMap; import java.util.Map; public class TestMini { /** * @param args */ public static void main(String[] args) { TestMini min = new TestMini(); min.init(); System.out.println(min.run()); } private String str = "abddddcasdfadfasdfsdfbcx"; private Map<Character, Integer[]> map = new HashMap<Character, Integer[]>(); public void init(){ map.put('a', new Integer[]{0, 0}); map.put('b', new Integer[]{0, 0}); map.put('c', new Integer[]{0, 0}); } public int run(){ char[] chars = str.toCharArray(); Object value = null; Integer[] il = null; int front = 0; int rear = 0; int minSum = chars.length; int count = 0; Object key = null; for(; rear < chars.length; rear++){ key = chars[rear]; value = map.get(key); if(value != null){ il = (Integer[])value; il[1]++; il[0] = rear; if(isValid()){ count = getCount(); minSum = (minSum > count)? count : minSum; checkFront(front); front++; } } } return minSum+1; } private void checkFront(int front){ Object value = map.get(str.charAt(front)); if(value != null){ Integer[] il = (Integer[])value; il[1]--; il[0] = 0; } } private boolean isValid(){ for(Integer[] entry : map.values()){ if(entry[1] <= 0){ return false; } } return true; } private int getCount(){ int min = str.length(); int max = 0; for(Integer[] entry : map.values()){ if(entry[0] < min){ min = entry[0]; } if(entry[0] > max){ max = entry[0]; } } return max - min; } }
相关文章推荐
- 给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n)
- 每天学习一算法系列(30)(给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n).)
- 给一个很长的字符串str 还有一个字符集比如"abc" 找出str 里包含"abc"的最短子串。要求O(n)
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
- 翻转子串 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
- 一道题:给一个字符串,和一个字符集,求该字符串包含所有字符集的最短子串
- 一个字符串中包含另一个字符串所有字符的最短子串
- 输入一个字符串,要求找出字符串中最大子串的长度
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·
- 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 找出字符串的最长子串,要求子串的所有字符相同 例如:str ="sssddddabcdef" 则输出字串为:dddd
- 找出一个字符串中最长连续相同子串
- 找出字符串的最长子串,要求子串的所有字符相同,如:"abcdeeefgh"结果是"eee"
- 一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba。
- 匹配一个字符串和另一个字符串的子串的方法
- 一个一万字长的连续字符串,找出其所有子串,并统计子串的出现次数
- 在一个长字符串中查找"包含所要求多个字符串的最短字符串"的VBscript算法
- 题目要求:建立一个类Str,将一个正整数转换成相应的字符串,例如整数3456转换为字符串"3456".