`
busy12377
  • 浏览: 2084 次
  • 性别: Icon_minigender_1
  • 来自: 呼和浩特
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java库中的String类中indexof(String s)应该改进为KMP算法

阅读更多
进来看数据结构中的串匹配算法!以为java中的算法应该是最优的!没想到是最简单的!
下面是java中串匹配算法!
static int indexOf(char[] source, int sourceOffset, int sourceCount,
			char[] target, int targetOffset, int targetCount, int fromIndex) {
		if (fromIndex >= sourceCount) {
			return (targetCount == 0 ? sourceCount : -1);
		}
		if (fromIndex < 0) {
			fromIndex = 0;
		}
		if (targetCount == 0) {
			return fromIndex;
		}

		char first = target[targetOffset];
		int max = sourceOffset + (sourceCount - targetCount);

		for (int i = sourceOffset + fromIndex; i <= max; i++) {
			/* Look for first character. */
			if (source[i] != first) {
				while (++i <= max && source[i] != first)
					;
			}

			/* Found first character, now look at the rest of v2 */
			if (i <= max) {
				int j = i + 1;
				int end = j + targetCount - 1;
				for (int k = targetOffset + 1; j < end
						&& source[j] == target[k]; j++, k++)
					;

				if (j == end) {
					/* Found whole string. */
					return i - sourceOffset;
				}
			}
		}
		return -1;
	}

public int indexOf(String str, int fromIndex) {
        return indexOf(value, offset, count,
                       str.value, str.offset, str.count, fromIndex);
    }

下面是数据结构中的算法:
static int indexOf(char[] source, int sourceOffset, int sourceCount,
			char[] target, int targetOffset, int targetCount, int fromIndex) {
		if (fromIndex >= sourceCount) {
			return (targetCount == 0 ? sourceCount : -1);
		}
		if (fromIndex < 0) {
			fromIndex = 0;
		}
		if (targetCount == 0) {
			return fromIndex;
		}
		int[] T=new int[targetCount+1];
		int c=1,t=0;
		while(c<targetCount){
			if(t==0||target[c-1]==target[t-1]){
				t++;c++;
				if(target[t-1]!=target[c-1])T[c]=t;
				else T[c]=T[t];
			}else{
				t=T[t];
			}
		}
	   	c=targetOffset;
		t=sourceOffset;
		int max1=targetCount+targetOffset;
		int max2=sourceCount+sourceOffset;
		while(c<max1&&t<max2){
			if(c==targetOffset||target[c]==source[t]){
				c++;t++;}
			else {
				c=T[c]+targetOffset;
			}
		}
		if(c>=max1)return t-sourceOffset-targetCount;
		else return -1;
	}

分享到:
评论
2 楼 busy12377 2012-06-26  
static int indexOf(char[] source,    
            char[] target,int fromIndex) {   
        int targetLength = target.length;
        int sourceLength = source.length;
        int[] next=new int[targetLength];   
       int i=0;
       next[0] = -1;
       int j = -1;
       while(i < targetLength-1){
    	   if(j == -1 || target[i] == target[j]){
    		   i++;j++;
    		   if(target[i]!=target[j]){
    			   next[i] = j;
    		   }else{
    			   next[i] = next[j];
    		   }
    	   }else{
    		   j = next[j];
    	   }
       }      
        j=-1;   
     	i=fromIndex;
        while(j<targetLength&&i<sourceLength){   
            if(j==-1||target[j]==source[i]){   
                i++;j++;
             }   
            else {   
                j=next[j];   
            }
        }   
        if(j>=targetLength)return i-targetLength;   
        else return -1;   
    }  
	static int indexOf(String src,String dest){
		return indexOf(src.toCharArray(),dest.toCharArray(),0);
	}
	static int indexOf(String src,String dest,int fromIndex){
		return indexOf(src.toCharArray(),dest.toCharArray(),fromIndex);
	}
1 楼 busy12377 2009-10-22  
如果source的长度是n,target的长度是m;则java库中的串匹配的复杂度是:
O(n*m);KMP的算法的复杂度约为O(n+m)!那位仁兄再改进改进!因为这是我
根据数据中的算法写的!有些地方不太简练!

相关推荐

    kmp.rar_indexof java_java KMP_kmp java

    给你A,B两个字符串,检查B串是否是A串的子串,类似于Java的String.indexOf("")。找到匹配失败时的最合适的回退位置,而不是简单的回退到子串的第一个字符(常规的枚举查找方式,是简单的回退到子串的第一个字符,KMP...

    477.475.JAVA基础教程_常用类-String课后算法题目3(477).rar

    在学习过程中,理解并熟练运用String类的API,同时通过解决实际的算法问题,可以有效提升对Java字符串处理能力,为后续更复杂的编程任务打下坚实的基础。因此,这份"JAVA基础教程"中的String类部分是Java初学者不容...

    算法练习之从String.indexOf的模拟实现开始

    `String.indexOf()` 方法是Java中用于在字符串中查找子串的第一个或最后一个出现位置的关键方法。在这个算法练习中,我们将深入理解其基本实现,并通过三个自定义函数`firstIndexOf()`, `lastIndexOf()` 和 `indexOf...

    KMP查找算法的泛型实现

    本篇将详细探讨KMP算法的泛型实现,以及如何在C++中进行编码。 1. **KMP算法原理** KMP算法的核心在于构建一个“部分匹配表”(也称为“失败函数”或“跳跃表”),它记录了前缀和后缀相同的最长长度。当主串中的...

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】

    10. String类:字符串的不可变性、常用方法(如concat、substring、indexOf等)。 11. 静态与非静态:静态变量、静态方法的使用场景。 12. this关键字:在实例方法和构造器中的作用。 13. 包:理解包的作用,如何...

    java面试题-leetcode题解之第28题找出字符串中第一个匹配项的下标.zip

    在Java中,我们可以使用`String`类提供的`indexOf()`方法来实现这个功能。`indexOf()`方法返回子字符串在主字符串中第一次出现的位置,如果找不到则返回-1。例如: ```java public int findFirstIndex(String ...

    Java检索字符串中是否存在某字符

    在实际编程中,Java的`String`类提供了多种字符串操作方法,如`indexOf()`用于查找子串第一次出现的位置,以及`lastIndexOf()`用于查找最后一次出现的位置。然而,对于大量数据的高效处理,自定义的算法如KMP则更为...

    java算法教程

    9. **字符串处理**:在Java中,String类提供了丰富的操作字符串的方法,如substring()、indexOf()、replace()等。KMP算法和Rabin-Karp算法用于模式匹配,Manacher's Algorithm用于求解最长回文子串。 10. **位运算*...

    DNAsequence java_java_

    1. **字符串处理**:Java中的`String`类是处理DNA序列的基础,它提供了丰富的操作方法,如`substring()`、`indexOf()`、`equals()`等,用于提取和比较DNA序列中的片段。 2. **正则表达式**:可以用来验证DNA序列的...

    获取目标字符串在源字符串第一次出现的下标Demo

    `indexOf()`是Java中`String`类的一个方法,它返回指定子字符串在这个字符串中第一次出现的索引。如果找不到,则返回-1。这个方法对于理解和编写字符串搜索的算法非常有帮助。 下面我们将详细介绍如何使用`indexOf...

    KMP.zip_C++_KMP

    《深入理解KMP算法及其C++实现》 KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中高效地查找子串的算法,由Donald Knuth、James H. Morris和Vernon Pratt共同提出。它避免了在匹配过程中出现部分匹配的重复比较...

    python,Java,JavaScript实现indexOf

    本文将详细探讨 `indexOf` 在 Python、Java 和 JavaScript 三种语言中的实现方式,帮助读者深入理解其工作原理。 ### `indexOf` 的含义 `indexOf` 函数的用途是查找一个字符串(称为子串)在另一个字符串(称为原...

    STRING_Maching_code.rar_in

    - `string`类:C#中的`string`类型提供了丰富的操作方法,如`IndexOf()`用于查找子串位置,`Substring()`用于截取子串等。 - `StringBuilder`类:对于大量字符串拼接,`StringBuilder`比多次使用`+`操作符更高效。...

    华为-华为od题库练习题之字符串字符匹配.zip

    7. 编程语言特性:熟悉各种编程语言中的字符串处理函数,如C++的std::string::find,Java的String.indexOf,Python的str.find等。 8. 动态规划:在某些特殊情况下,字符串匹配问题可以通过动态规划方法解决,例如...

    MyString.zip

    例如,`indexOf`可能需要使用KMP算法或其他高效的字符串搜索算法。 此外,我们还需要处理字符串连接操作。由于Java的`+`操作符默认用于字符串连接,我们可以自定义`MyString`的`concat`方法,但不能直接改变原对象...

    Java 实现文章汉字关键词(违禁词)识别

    1. **字符串处理**:Java的String类提供了丰富的字符串操作方法,如indexOf()和contains(),可以用于基本的关键词匹配。但这种方法效率较低,不适用于大量文本的处理。 2. **正则表达式**:Java的Pattern和Matcher...

    java过滤敏感词

    `String`类提供了丰富的API,如`indexOf()`、`replace()`和`replaceAll()`,可以用来查找和替换敏感词。例如,你可以通过遍历字符串,检测每个字符是否出现在敏感词列表中。 2. **正则表达式**:对于复杂的敏感词...

    bookish-invention:JAVA中搜索字符串算法的实现

    在Java中,可以使用`indexOf()`方法实现朴素匹配。例如: ```java public class NaiveSearch { public static int search(String text, String pattern) { for (int i = 0; i () - pattern.length(); i++) { if ...

    demo_并返回出现起始索引_获取一个字符串在另一个字符串中出现的次数_DEMO_

    在`tips.txt`文件中,可能会包含一些实现过程中的技巧或者注意事项,例如性能优化(如使用KMP算法等高效字符串匹配算法)、错误处理等。不过,由于没有提供具体的文件内容,这里无法给出更详细的解释。 总的来说,...

Global site tag (gtag.js) - Google Analytics