给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。
如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。
说明在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?
——不需要。
样例给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解 "BANC"
import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。 注意事项 如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。 您在真实的面试中是否遇到过这个题? Yes 说明 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要。 样例 给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解 "BANC" * * @author Dell * */ public class Test32 { public static String minWindow(String source,String target) { String result=""; for(int i=0;i<source.length();i++) { for(int j=i;j<source.length();j++) { String temp=source.substring(i, j+1); if(temp.length()<target.length()) continue; int k; boolean[] visited=new boolean[temp.length()]; for(k=0;k<target.length();k++) { boolean flag=false; for(int m=0;m<temp.length();m++) { if(target.charAt(k)==temp.charAt(m)&&visited[m]==false) { visited[m]=true; flag=true; break; } else continue; } if(flag==false) break; } if(k>=target.length()) { if(result==""||result.length()>temp.length()) { result=temp; } } } } return result; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); String source=sc.nextLine(); String target=sc.nextLine(); System.out.println(minWindow(source,target)); } } 2:
给定一个字符串S和T,在S中找到一个最小的子串包含T中的所有字符,时间复杂度为O(n)。 Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
举例, S = "ADOBECODEBANC" T = "ABC" 最小子串是"BANC".
其中n是字符串S的长度,因为每个字符在维护窗口的过程中不会被访问多于两次。
也就是代码中T的长度。
记录字母出现次数的数据结构有采用哈希Map的也有采用数组的,这里介绍一下数组的用法,因为它用了比较取巧的方式。 大小写字母的ASCII码不大于128,这样array['A']=3指A出现3次,array['B']=1指B出现了一次,以此类推,不能用常规意义上的定义array[0]=3表示A出现3次,这样就多了一层映射!故而数组的长度设置为128即可存放所有的字母。明白了么?