所以在这里,我坚持使用我的程序,这是一个简单的事情。所以基本上在搜索metod是我有3个变量,你可以看到,Char P char T和List pos。在方法下面你可以看到有一个Main,它表示char P,char T有什么值,我的想法是创建一个匹配的程序,我在其中输入一个值P并查看char T中是否有相同的值。它发现了,它应该继续,直到价值完成。所以在找到结果后的main方法中,它应该给你设置值的位置索引。
现在的问题是,如果我给出一个正确的值示例P = abc T = abcqweqweabc它会给我一个正确的,但是如果我做abcqweqweqwe它会一直循环并且永远不会结束这会杀死我的处理器和ram (呵呵)我一直想弄明白,但我找不到问题。它似乎应该工作,我不明白为什么它喜欢它。
public class StringSearch {
public static void search(char[] P, char[] T, List<Integer> pos) {
int i = 0;
int j;
while(i!=P.length){
for (j= 0; j<T.length; j++){
if(P[i] == T[j]) {
i++;
if(i == P.length) {
pos.add((j-(P.length-1)));
i = 0;
if(j==T.length-1) {
i = P.length;
}
}
}
else {
i = 0;
}
}
}
public static void main(String[] args) {
ArrayList<Integer> where = new ArrayList<Integer>();
search("abcx".toCharArray(), "abcdabcxxabctx".toCharArray(), where);
for (int i : where) {
System.out.println(i);
}
}
}
还请!如果你需要知道一些事情。只是评论,我可能会在一分钟内回答你!随时问问题!
编辑:为了给出我正在尝试做的确切含义,我们的字符T是“文本”的位置,字符P是我想要匹配P和T的字母。所以每当我们找到char P和T之间的正确匹配,它应该添加到我们称为pos的列表中。稍后会给我们一个结果,在索引中匹配是相同的。比如T = qweabcqwe和P = abc。它应该给我们一个4的结果。所以我要做的是看看这两者之间是否存在匹配,并且位置中的位置是否相同,如果存在,则放入列表然后循环在主要方法将告诉我们在哪里。编辑第2.3部分:
public static void search(char[] P, char[] T, List<Integer> pos) {
for (int i=0;i<=T.length-P.length;) {
if (T[i] == P[0]) {
boolean match=true;
for (int j=0;j<P.length;j++) {
if (T[i+j] != P[j]) {
match = false;
break;
}
}
if (match) {
pos.add(i);
i = P.length -1;
}
}
}
}
public static void main(String[] args) {
ArrayList<Integer> where = new ArrayList<Integer>();
search("abcx".toCharArray(), "abcdabcxxabctx".toCharArray(), where);
for (int i : where) {
System.out.println(i);
}
}
}
答案 0 :(得分:0)
如果甚至有一个案例
if(P[i] != T[j])
然后你将我设为0
else {
i = 0;
你陷入了while循环
但基本上你要做的是给你与indexOf()
相同的结果试试这个:
String Str = new String("qweabcqwe");
String SubStr1 = new String("abc");
System.out.println( Str.indexOf( SubStr1 )); // will print 3
答案 1 :(得分:0)
如果你想自己实现它,你可能想在这里使用Java详细检查KMP算法的解释:http://tekmarathon.com/2013/05/14/algorithm-to-find-substring-in-a-string-kmp-algorithm/
答案 2 :(得分:0)
要查找每个数组中相同位置的每个字符的索引,只需执行以下操作:
for (int i=0;i<P.length && i<T.length;i++) {
if (P[i] == T[i]) {
pos.add(i);
}
}
您只需要一个循环,因为您只比较一个值。
如果你想找到子串的位置,那么你需要一个嵌套循环,但它仍然可以是一个简单的for循环。
for (int i=0;i<=P.length-T.length;i++) { // Can stop when we get to within T length of the end of P
if (P[i] == T[0]) {
boolean match=true;
for (j=0;j<T.length;j++) {
if (P[i+j] != T[j]) {
match = false;
break;
}
}
if (match) {
pos.add(i);
// You might want to add T.length-1 to i here to cause it to skip, it depends if you want to find overlapping results or not. (i.e. searching for bobob in bobobob.
}
}
}