我想判断一个字符串是否被另一个包含 不是有str1.indexOf(str2)吗?>=0即str1包含str2... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的思路是对的,程序是错的。程序的错误表现在两个方面,一个低级错误,一个考虑不周全的错误。低级错误是for(int b=0;b <str1.length()-1;b++)应该改为for(int b=0;b <str1.length();b++),即:public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("第一个字符串"); String str1 = input.next(); System.out.println("第二个字符串"); String str2 = input.next(); int counter = 0; for (int a = 0; a < str2.length(); a++) { if (str1.charAt(0) == str2.charAt(a)) { for (int b = 0; b < str1.length(); b++) { if (str1.charAt(b) == (str2.charAt(a + b))) { counter++; } } } } if (counter == str1.length()) { System.out.println(str1 + "包含在" + str2); }} 考虑不周全的错误表现在,整体的算法思路是正确的,在实现中,counter没有注意失配后归零,没有注意完全匹配后立即返回。即str1 = "abc",str2 = "aeabcd"的时候,第一个a匹配上,counter变成1,后续失配后没有归零。同样导致了str1="abc",str2="aeabdd"会认为包含;也会导致str1="abc",str2="eabcdabcd"会认为不包含。这个算法应该符合你的思路:public static void main(String[] args) { /* Scanner input = new Scanner(System.in); System.out.println("第一个字符串"); String str1 = input.next(); System.out.println("第二个字符串"); String str2 = input.next();*/ String str1 = "abc"; String str2 = "aeabcd"; for (int a = 0, counter = 0; a < str2.length(); a++, counter = 0) { if (str1.charAt(0) == str2.charAt(a)) { for (int b = 1; b < str1.length(); b++) { if (str1.charAt(b) == (str2.charAt(a + b))) { counter++; } } if (counter == str1.length() - 1) { System.out.println(str1 + "包含在" + str2); return; } } }} 另外字符串匹配的算法效率上如果讲究的话,有一种叫KMP的算法比较快,父串指针失配后无需回朔。 KMP算法是本科《算法与数据结构》课教材中的内容,如果教材里涉及了字符串匹配,那绝对有KMP算法。你也可以baidu一下。我看的是清华大学出版社出的严蔚敏写的那本经典教材 参考下api中方法的源代码,就知道自己写的程序的缺陷了 另外我还有个问题程序中这句话str1.charAt(0)==str2.charAt(a))如果写成str1.charAt(0).equals(str2.charAt(a)))会报错 可是equals不也是判断俩个字符是否相等的吗 很多方法都可以实现,多查API,多用就好了! 提个小问题,什么叫面向对象。面向对象就是不要把算法写在 main 函数里。你的算法还有点可以优化下,如 if(str1.length() > str2.length()) return false; if (str1.charAt(0)==str2.charAt(a) ){ if( str1.length() > str2.length()- a) return false; } 正则表达式正解:String str1 = "abc"; String str2 = "aeabcd"; Pattern pattern = Pattern.compile(str1); Matcher matcher = pattern.matcher(str2); //当找到时,输出。 while(matcher.find()){ System.out.println(matcher.group()); } 正则在这里貌似不使用,如果str1="*ab" str2="adcdab",这样就不适用了 str1.charAt(0).equals(str2.charAt(a)))会报错? 恩,不是会报错,是根本就没有这个方法。因为你的str1.charAt(0)是int类型的,意思是“ 返回指定索引处的 char 值”,int变量是没有equals方法的,如果你的变量时string,则必须用equals方法比较而不能用==比较 char 是基本数据类型,它不是Object,所有它没有方法 java如何写菜单 swt中可不可以像vb一样通过拖拽控件来编写界面 送分题 java 内部类问题 请高手帮忙 要得到当前日期的下一个月的日期,怎样实现? 关于JOptionPane的一个改错 面试题一道!大家看看有什么好的算法! tomcat的web-inf/classes下编译.java的问题,憋了很久了,希望好心人来看看!!100分相送!! 笔试问题,各位前辈请赐教 谁那有JBuilder6 Personal版的Serial Number 和 Key,我进不了Borland主页申请。 请教JAVA中初始化块的作用 使用自己打的jar包,提示找不到类
程序的错误表现在两个方面,一个低级错误,一个考虑不周全的错误。
低级错误是for(int b=0;b <str1.length()-1;b++)应该改为for(int b=0;b <str1.length();b++),即:public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("第一个字符串");
String str1 = input.next();
System.out.println("第二个字符串");
String str2 = input.next();
int counter = 0;
for (int a = 0; a < str2.length(); a++) {
if (str1.charAt(0) == str2.charAt(a)) {
for (int b = 0; b < str1.length(); b++) {
if (str1.charAt(b) == (str2.charAt(a + b))) {
counter++;
}
}
}
}
if (counter == str1.length()) {
System.out.println(str1 + "包含在" + str2);
}
}
即str1 = "abc",str2 = "aeabcd"的时候,第一个a匹配上,counter变成1,后续失配后没有归零。
同样导致了str1="abc",str2="aeabdd"会认为包含;
也会导致str1="abc",str2="eabcdabcd"会认为不包含。这个算法应该符合你的思路:public static void main(String[] args) {
/*
Scanner input = new Scanner(System.in);
System.out.println("第一个字符串");
String str1 = input.next();
System.out.println("第二个字符串");
String str2 = input.next();*/
String str1 = "abc";
String str2 = "aeabcd";
for (int a = 0, counter = 0; a < str2.length(); a++, counter = 0) {
if (str1.charAt(0) == str2.charAt(a)) {
for (int b = 1; b < str1.length(); b++) {
if (str1.charAt(b) == (str2.charAt(a + b))) {
counter++;
}
}
if (counter == str1.length() - 1) {
System.out.println(str1 + "包含在" + str2);
return;
}
}
}
}
str1.charAt(0).equals(str2.charAt(a)))会报错 可是equals不也是判断俩个字符是否相等的吗
面向对象就是不要把算法写在 main 函数里。
你的算法还有点可以优化下,如 if(str1.length() > str2.length()) return false;
if (str1.charAt(0)==str2.charAt(a) ){
if( str1.length() > str2.length()- a) return false;
}
String str1 = "abc";
String str2 = "aeabcd";
Pattern pattern = Pattern.compile(str1);
Matcher matcher = pattern.matcher(str2);
//当找到时,输出。
while(matcher.find()){
System.out.println(matcher.group());
}
正则在这里貌似不使用,如果str1="*ab" str2="adcdab",这样就不适用了