尺取法
最短摘要生成
package 字符串;
import java.util.Arrays;
public class 最短摘要生成_尺取法 {
public static void extractSummary(String[] description,String[] keys) {
int begin = -1;
int end = -1;
int sc = -1;
int minLen=Integer.MAX_VALUE;
int[] found=new int[keys.length];
for(int i=0;i<description.length;i++) {
Arrays.fill(found, 0);
String word=description[i];
int index=indexOf(keys,word);
if(index==-1) {
continue;
}
else{
found[index]=1;
}
int j;
if(sc==-1)
j=i+1;
else {
j=sc;
}
for(;j<description.length;j++) {
String nextWord=description[j];
int nextIndex=indexOf(keys,nextWord);
if(nextIndex==-1||found[nextIndex]==1) {
continue;
}
else {
found[nextIndex]=1;
if(sum(found)==keys.length) {
sc=j;
if(j-i+1<minLen) {
minLen=j-i+1;
begin=i;
end=j;
}
break;
}
}
}
}
show(description,begin,end);
}
private static int indexOf(String[] keys, String word) {
for(int i=0;i<keys.length;i++) {
if(keys[i].equals(word))
return i;
}
return -1;
}
private static void show(String[] description, int begin, int end) {
if(begin==-1||end==-1) {
System.out.println("无满足要求子串");
System.exit(0);
}
for (int i =begin; i <= end; i++) {
System.out.print(description[i]+" ");
}
}
private static int sum(int[] found) {
int res=0;
for (int i = 0; i < found.length; i++) {
res+=found[i];
}
return res;
}
public static void main(String[] args) {
String[] words = {"a","b","c","d","a","a","b","c","t"};
String[] keys ={"a","b","c"};
extractSummary(words,keys);
String[] words1 = {"a","b","d","c","a","a","b","c","t"};
String[] keys1 ={"ab","b","c"};
extractSummary(words1,keys1);
}
}
hiho字符串
package 字符串;
import java.util.Scanner;
public class hiho字符串_尺取法2 {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
String s=reader.nextLine();
char[] word=s.toCharArray();
System.out.println(hiho(word));
}
private static int hiho(char[] word) {
int minLen=Integer.MAX_VALUE;
int j=-1;
int end=-1;
int begin=-1;
for(int i=0;i<word.length;i++) {
char c=word[i];
if(check(c)) {
if(j==-1) {
j=i+1;
}
for(;j<word.length;j++) {
char nextC=word[j];
if(check(nextC)&&containAll(word,i,j)) {
if(check(word,i,j)&&j-i+1<minLen) {
minLen=j-i+1;
begin=i;
end = j;
}
break;
}
}
}
}
show(word,begin,end);
return (minLen==Integer.MAX_VALUE?-1:minLen);
}
private static boolean check(char[] word, int i, int j) {
int c1=0,c2=0,c3=0;
for(int k=i;k<=j;k++) {
if(word[k]=='h') c1++;
if(word[k]=='i') c2++;
if(word[k]=='o') c3++;
}
return c1==2&&c2==1&&c3==1;
}
private static boolean containAll(char[] word, int i, int j) {
int c1=0,c2=0,c3=0;
for(int k=i;k<=j;k++) {
if(word[k]=='h') c1++;
if(word[k]=='i') c2++;
if(word[k]=='o') c3++;
}
return c1>=2&&c2>=1&&c3>=1;
}
private static boolean check(char c) {
return c=='h'||c=='i'||c=='o';
}
private static void show(char [] a,int begin, int end) {
if(begin==-1||end==-1) {
System.out.println("无满足要求子串");
System.exit(0);
}
for (int i =begin; i <= end; i++) {
System.out.print(a[i]+" ");
}
}
}