CF 58A.Chat room(Java实现)
问题分析
输入一个字符串,判断这个字符串是否能按序组成“hello”。
思路分析
题目说的意思是任意删除字母,能否组成"hello",实际就是判断'h'、'e'、'l'、'o'的下标是否一个比一个大,同时看'e'和'o'之间是否有两个'l'。这里我使用了indexof函数,判断'h'的首次出现位置,确认有‘h’时就使用substring函数删掉前面的所有字符,再判断‘e’的位置,同理删除前面的所有字符,依次类推。这样就能保证四个字符按序出现,如果indexof函数返回值为-1,说明没有这个字符就输出NO并结束。同时可以用input.indexOf("l")!=input.lastIndexOf("l"),判断是否有两个‘l’。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();//输入值
int h=input.indexOf("h");//获取h首次出现的位置
if (h!=-1){//如果有h
input=input.substring(h);//截取h出现后的子字符串
}else {//如果没有h
System.out.println("NO");//输出no
return;//并结束
}
int e=input.indexOf("e");//获取更新的子字符串的e首次出现的位置
if (e!=-1){//如果有e
input=input.substring(e);//截取e出现后的子字符串
}else {//如果没有
System.out.println("NO");//输出no
return;//并结束
}
int l=input.indexOf("l");//获取更新的子字符串的l首次出现的位置
if (l!=-1&&input.indexOf("l")!=input.lastIndexOf("l")){//如果l存在,且第一个l和最后一个l的位置不同,即至少有两个l
input=input.substring(l);//截取l出现后的子字符串
}else {//如果没有l
System.out.println("NO");//输出no
return;//并结束
}
int o=input.indexOf("o");//获取更新的子字符串的o首次出现的位置
if (o!=-1){//如果有o
System.out.println("YES");//构成“hello”,输出YES
}else {//没有o
System.out.println("NO");//失败,输出NO
}
}
}
但是这么看来重复的代码有点多,你可以设定一个方法,通过调用解决反复冗杂的问题,也可以换一个方法
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();//输入字符串
int index=input.indexOf("h");//用index统一定义某个字符首次出现的位置
if (index==-1){//如果h不存在
System.out.println("NO");//输出No
return;//结束
}
index=input.indexOf("e",index+1);//此处不使用截取,而是从h之后的位置计算e出现的位置
if (index==-1){//如果e不存在
System.out.println("NO");//输出no
return;//结束
}
index=input.indexOf("l",index+1);//同理,上一个index之后计算l出现的位置
if (index==-1||-1==input.indexOf("l",index+1)){//此处判断此时是否有一个l,同时判断还有没有下一个l,如果任一不存在就报错
System.out.println("NO");//输出no
return;//结束
}
index=input.indexOf("l",index+1);//更新第二个l的位置
index=input.indexOf("o",index+1);//在第二个l的位置之后寻找o
System.out.println(index==-1?"NO":"YES");//三目运算判断输出的值
}
}
但是这个题的示例有个bug,即使不判断h是否存在,都会通过,所有的示例中都会有h出现
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。