记得本科的时候算法课上看到过这个题目,当时没有做出来,今天做360笔试的时候竟然仍然没做出来,真蛋疼。回来研究了半天,我擦,两个小时做那么多题目,这个肯定做不出来。
题目:
大意是:给定一个字符串S:“BLFBFSYDLEAKLFBYM”,和一个关键字T:“LBY”,求出在S中包含T的最小字符串?那么应该求出最小字符串:“LFBY”
思路一:遍历T,再遍历S。(咋一看是这样,但是操作起来比较麻烦,我也没实现)
思路二:分别求出关键字T中第一个字符和最后一个字符在S中的位置P1,P2,那么我们要求的答案就在P1和P2的组合当中。(额外浪费了很多空间)
按道理,两种思路都可以行的通。目前,我按照思路二实现Java版的:
<span style="font-size:18px;"> </span><span style="font-size:14px;"> public static void main(String []args) { final String content="BLFBFSYDLEAKLFBYM"; final String key="LBY"; System.out.println(getAbstract(content, key)); } /* * content="BLFBFSYDLEAKLFBYM" * key="LBY" * 求包含key的最小字符串 * 注意abstract是L***Y,开始的肯定是L,结束的是Y */ public static String getAbstract(String content,String key) { String tempString=""; // * 依次找到在content中L出现的位置和Y出现的位置 // * 那么要求的摘要只可能出现在L的位置和Y的位置的组合中 ArrayList<Integer> keyFirstList=new ArrayList<Integer>(); ArrayList<Integer>keyLastList=new ArrayList<Integer>(); for(int i=0;i<content.length();i++) { if(content.charAt(i)==key.charAt(0)) keyFirstList.add(i); else if(content.charAt(i)==key.charAt(key.length()-1)) keyLastList.add(i); else ;//do noting } //得到所有的可能位置组合 //注意,很多组合显然不合适,start位置必须小于end的位置 int [][]maxAbstact=new int[keyFirstList.size()][keyLastList.size()]; for(int i=0;i<keyFirstList.size();i++) for(int j=0;j<keyLastList.size();j++) { if(keyFirstList.get(i)>=keyLastList.get(j)) maxAbstact[i][j]=-1; else { maxAbstact[i][j]=isContainKey(content, key, keyFirstList.get(i), keyLastList.get(j)); } } int minLength=content.length(); int start = 0 ,end = 0; //求出数据中的最小值,即要求字符串的最小的长度 for(int i=0;i<keyFirstList.size();i++) for(int j=0;j<keyLastList.size();j++) { if(maxAbstact[i][j]>-1&&maxAbstact[i][j]<minLength) { minLength=maxAbstact[i][j]; start=i; end=j; } } for(int i=keyFirstList.get(start);i<=keyLastList.get(end);i++) { tempString+=content.charAt(i); } return tempString; } /* * 从start 到end的位置是否包含key */ public static int isContainKey(String content ,String key,int start,int end) { int newStart=start; for(int i=1;i<key.length()-1;i++) { int j=newStart+1; for(;j<end;j++) { if(content.charAt(j)==key.charAt(i)) { newStart=j; break; } } if(j==end) return -1; } return end-start; }</span>
时间: 2024-10-24 16:08:22