题目描述:有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项链才能够拿到最多的宝石
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
System.out.println(chains(s));
}
}
public static int chains(String s){
//方法一 循环取模的方法 看讨论中别人的思路
//因为要包含五种宝石,所以子串至少要有五个宝石,依次循环
int len=s.length();
int[] fre=new int[5];//记录五种宝石出现频率的数组
for(int i=5;i<s.length();i++){//x为寻找子串的长度
for(int j=0;j<s.length();j++){//j为从字符串的哪一位开始找起
for(int k=j;k<j+i;k++){//本层循环表示从j开始 遍历i个字符
if(s.charAt(k%len)=='A'||s.charAt(k%len)=='B'||s.charAt(k%len)=='C'||s.charAt(k%len)=='D'||s.charAt(k%len)=='E'){
fre[s.charAt(k%len)-'A']++;
}
}
//循环了一次,看看这次是否将所有5种需要的字符都包含进来了
int num=0;
for(int m=0;m<5;m++){
if(fre[m]>=1)
num++;
}
if(num==5)
return len-i;
for(int m=0;m<5;m++){
fre[m]=0;
}
}
}
//循环了所有的子串长度可能 都没有合适的
return 0;
}
}
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.next();
int len=s.length();
int left=0;
int right=0;
s=s+s;
int num=0;
int[] freq=new int[5];
int min=len+1;
while(true){
while(right<s.length() && num<5){
if(s.charAt(right)=='A'||s.charAt(right)=='B'||s.charAt(right)=='C'
||s.charAt(right)=='D'||s.charAt(right)=='E'){
if(freq[s.charAt(right)-'A']==0)
num++;
freq[s.charAt(right)-'A']++;
}
right++;
}
if(num<5)
break;
min=Math.min(min,right-left);
if(s.charAt(left)=='A'||s.charAt(left)=='B'
||s.charAt(left)=='C'||s.charAt(left)=='D'||s.charAt(left)=='E'){
if(freq[s.charAt(left)-'A']==1)
num--;
freq[s.charAt(left)-'A']--;
}
left++;
}
if(min==len+1)
System.out.println(0);
else
System.out.println(len-min);
}
}
}