2 m0 38110604 m0_38110604 于 2017.09.13 23:30 提问

java实现BF算法求一个字符串在另一个字符串中的位置出现空指针异常:

import java.util.Scanner;
//这是我的代码
public class Demo8 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
String str1 = s.nextLine();
System.out.println("请输入第二个字符串:");
String str2 = s.nextLine();
System.out.println("请输入两个字符串:");
int index = find(str1,str2);
System.out.println("str2在str1中的位置为:"+index);
}
public static int find(String str1,String str2){//接收两个字符串
int index = 0;//主串从下标0开始第一趟匹配
int i = 0,j = 0;设置比较的起始下标
char[] arr1 = str1.toCharArray();//转换成字符数组
char[] arr2 = str2.toCharArray();
while(arr1[i]!='\0' && arr2[j]!='\0'){
if(arr1[i]==arr2[j]){
i++;
j++;
}else{
index++;
i = index;//i,j分别回溯
j = 0;
}
}
if(arr2[j]=='\0'){
return index+1;//返回本趟匹配的开始位置(不是下标)
}
return -1;
}
}
高手请帮我看一下!ArrayIndexOutOfBoundsException

4个回答

jdz199409
jdz199409   2017.09.14 09:53
已采纳

这不是C语言,!='\0'在Java中是不规范的~

m0_38110604
m0_38110604 嗯嗯 就是这个问题
8 个月之前 回复
qq_28173395
qq_28173395   2017.09.14 23:54

首先,在Java里面判断数组是不是到了最后一个没有用”!='\0”这个来判断的,你可以直接判断(i < arr1.length && j < arr2.length),java里没有结束符,所以才会产生越界。
你可以试试这个代码
public class Demo8 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
String str1 = s.nextLine();
System.out.println("请输入第二个字符串:");
String str2 = s.nextLine();
System.out.println("请输入两个字符串:");
int index = find(str1, str2);
System.out.println("str2在str1中的位置为:" + index);
}

public static int find(String str1, String str2) {// 接收两个字符串
    int index = 0;// 主串从下标0开始第一趟匹配
    int i = 0, j = 0;// 设置比较的起始下标
    char[] arr1 = str1.toCharArray();// 转换成字符数组
    char[] arr2 = str2.toCharArray();
    while (i < arr1.length && j < arr2.length) {
        if (arr1[i] == arr2[j]) {
            i++;
            j++;
        } else {
            index++;
            i = index;// i,j分别回溯
            j = 0;
        }
    }
    if (j != 0 && j == arr2.length) {
        return i - j;// 返回本趟匹配的开始位置(不是下标)
    }
    return -1;
}

}

m0_38110604
m0_38110604 对,你说的是对的。
8 个月之前 回复
jdz199409
jdz199409   2017.09.14 09:51

兄弟,你是不是没判断arr1[i]与arr2[j] 中 i 与 j 的范围是 0 <= i < arr1.length ; 0 <= j < arr2.length

m0_38110604
m0_38110604 Java与C语言判断数组结束的标志不一样
8 个月之前 回复
out_of_it_farmer
out_of_it_farmer   2017.09.14 10:04
while(arr1[i]!='\0' && arr2[j]!='\0'){
if(arr1[i]==arr2[j]){
i++;
j++;
}else{
index++;
i = index;//i,j分别回溯
j = 0;
}
}

这段代码,if判断为true时,i++,j++,然后循环到while判断时,length较小的数组会ArrayIndexOutOfBoundsException;比如:

int[] arr1=[1,2,3]; int[] arr2=[1];
if(arr1[0]==arr2[0]){
i++;
j++; // 这会导致上面的while判断出现arr2[1]!='\0'; throw ArrayIndexOutOfBoundsException
}

m0_38110604
m0_38110604 两种需要判断数组结束不一样
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
串的定长顺序存储结构:求串s中出现的第一个最长重复子串及其位置
假设以定长顺序存储结构表示串,试设计一个算法,求串s中出现的第一个最长重复子串及其位置,并分析你的算法的时间复杂度。 定长顺序串SString的类型定义: typedef unsigned char SString[MAXSTRLEN+1];   /* s[0] is the string's length */
C# 找出一个子串在另一字符串中出现的所有位置
如果需要在一个字符串中找出一个特定串所有出现的位置,可以采用下面代码:        public int[] GetSubStrCountInStr(String str, String substr,int StartPos)        ...{            int foundPos = -1;            int count = 0;            L
得到一个字符串在另一个字符串中第一次出现的索引
/** * 返回model在target第一次出现的索引 * @param target * @param model * @return */ public int inStr(String target,String model){ if(target == null) return -1;
求串的第一个最长重复子串的下标和长度
采用顺序结构存储串,编写一个程序,求串s中出现的第一个最长重复子串的下标和长度。
java获取一个字符串在另一个字符串中出现的次数
java获取一个字符串在另一个字符串中出现的次数
在一个字符串中查找另外一个字符串的全排列出现位置
1、在一个字符串中查找另外一个字符串任意的全排列出现位置。例如:A=”abcfsfcba”,B=”abc”,则返回{0,6}。//the des's character must be adjacent public static List<Integer> getIndex(String res,String des){ List<Integer> list=new Arr
kmp算法 查找一个字符串在另一个字符串出现的位置
kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚。在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚。 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是
字符串模式匹配的BF算法与KMP算法
设有主串s和子串t,子串t定位是指在主串s中找到一个与子串t相等的子串。通常把主串s称为目标串,把子串t称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串t。         传统的字符串模式匹配算法(也就是BF算法)就是对于主串和模式串双双自左向右,一个一个字符比较,如果不匹配,主串和模式串的位置指针都要回溯。这样的算法时间复杂度为O(n*m),其中n和m分别为串s
查找一个字符串在另一个字符串中出现的所有位置
<br />在一个PHP学习群里,看见有人提问怎么一个字符串在另一个字符串中出现的所有位置,写个函数出来,下面是我写的函数,抛砖引玉吧!<?php //求字符在字符串内出现的位置 $str = 'abcdefgabcefhiabgiswinglqaieuusnakshrirsa'; $a = 'a'; echo strpos($str,$a); echo '<br>'; $arr = find_pos($str,$a); print_r($arr); /* *$str 被查找字符串
求一个串中出现的第一个最长可重叠重复子串 [后缀数组解法]
题目描述:求一个串中出现的第一个最长重复子串 采用顺序结构存储串,编写一个程序,求串s中出现的第一个最长重复子串的下标和长度。 求解思路:一、主要数据结构及涉及知识点核心结构:后缀数组其他涉及:string数据类型、vector容器[顺序存储]、map容器、STL