`

字符串查找

Kmp 
阅读更多

题目:

对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1

说明

在面试中我是否需要实现KMP算法?

  • 不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。
样例

如果 source = "source" 和 target = "target",返回 -1

如果 source = "abcdabcdefg" 和 target = "bcd",返回 1

 

解决这道题的思路有两个,①比较暴力的查找方法,时间复杂度为O(m*n),一个个的遍历循环,这种方法不建议使用,这里就不再给出代码;
②使用KMP算法,这个能把时间复杂 度缩短至O(n),Kmp算法的思路就是给出两个字符串source(资源字符串),target(目标字符串),以target字符串为目标 ,计算出每一个位置的相同最长前缀和最大后缀,把每一个位置的匹配长度,存储在next数组中,然后在source字符串中开始匹配,当匹配到第i个不相同的时候,查看target字符串该位置对应的next[i]数组值,然后用source[i]与target[next[i]]值进行匹配,这就是本道题的思路,下面我们用代码来讲解一下,代码如下:
public class Solution {
    /*
     * @param source: source string to be scanned.
     * @param target: target string containing the sequence of characters to match
     * @return: a index to the first occurrence of target in source, or -1  if target is not part of source.
     */
    public int strStr(String s, String m) {
        // write your code here
        if (s==null||m==null||s.length()<m.length()){
            return -1;
        }
        char[] ss = s.toCharArray();
        char[] ms = m.toCharArray();
        int si = 0;
        int mi = 0;
        int[] next = getNextArray(ms);
        while (si<ss.length&&mi<ms.length){
            if (ss[si] == ms[mi]){
                si++;
                mi++;
            }else if (next[mi] == -1){
                si++;
            }else {
                mi = next[mi];
            }
        }
        return mi==ms.length?si-mi:-1;
    }
    
    public static int[] getNextArray(char[] s){
        if (s.length == 0){
            return new int[] {-1};
        }
        int[] next = new int[s.length+1];
        next[0] = -1;
        next[1] = 0;
        int p = 2;
        int c = 0;
        while (p<next.length){
            if (s[p-1]==s[c]){
                next[p++] = ++c;
            }else if (c>0){
                c = next[c];
            }else {
                next[p++] = 0;
            }
        }
        return next;
    }
}
 
分享到:
评论

相关推荐

    多文本内字符串查找程序

    在IT行业中,字符串查找是一个常见的任务,特别是在编程领域。这里我们关注的是一个名为"多文本内字符串查找程序"的项目,它使用C#语言编写。这个程序的主要目标是高效地在一个或多个文本文件中查找指定的字符串。让...

    超好用的字符串查找工具

    在IT领域,字符串查找工具是一种极其实用的软件,它能够帮助用户快速、高效地在大量文本数据中定位特定的字符串。这种工具对于开发者、数据分析师、程序员以及任何需要处理大量文本信息的人来说,都是不可或缺的助手...

    字符串查找替换程序设计

    在计算机科学领域,字符串查找与替换是编程中常见的任务,特别是在文本处理、数据处理和文本编辑器等应用中。这个程序设计课程设计的目标是让学生掌握如何有效地实现这些功能,理解其背后的算法,并能够应用于实际...

    字符串查找替换器,不但可替换还可以查找

    在IT领域,字符串查找与替换是编程中非常基础且实用的操作。无论是在文本处理、数据分析还是软件开发中,我们经常需要对大量文本进行查找特定字符或字符串,并进行替换。这个"字符串查找替换器"工具正是为了满足这样...

    字符串查找替换(超经典)

    在IT领域,字符串查找与替换是编程中非常基础且重要的操作。无论是在文本处理、数据分析还是日志分析等场景,我们都可能需要对字符串进行查找和替换。以下将详细阐述这一主题。 字符串查找是指在给定的字符串中寻找...

    多文件中字符串查找工具

    "多文件中字符串查找工具"就是这样的一个实用程序,它能够帮助用户快速、高效地在大量的文本文件中搜索特定的字符串。这个工具的使用极大地提高了工作效率,避免了手动逐个文件检查的繁琐过程。 首先,我们要理解的...

    字符串查找替换,多文件字符串查找替换

    在IT行业中,字符串查找与替换是一项基础且重要的操作,它广泛应用于文本编辑、代码修改、数据分析等多个领域。这里我们将深入探讨这一主题,并结合"字符串查找替换"这个软件工具的使用,来详细介绍相关知识点。 ...

    一款字符串查找、替换的好工具

    在IT领域,字符串查找与替换是日常编程和文本处理中不可或缺的功能。无论是开发软件、调试代码,还是处理大量文本数据,我们都需要高效精准地完成这一任务。标题提到的"一款字符串查找、替换的好工具"正是针对这个...

    字符串查找和替换的实现例子(1KB)...

    在这个例子中,我们将深入探讨VB(Visual Basic)中关于字符串查找和替换的实现方法。VB是一种流行的事件驱动编程语言,尤其适用于开发用户界面丰富的应用程序。在VB中处理字符串,我们可以利用其内建的字符串函数和...

    C字符串查找优化,strstr函数查找无中文汉字问题

    C strstr字符串查找函数优化,解决查找中文汉字匹配存在错误BUG问题。支持GBK、GB18030字符串。

    字符串查找和替换的实现例子(1KB)

    在IT领域,字符串查找和替换是编程中非常基础且重要的操作。它们广泛应用于文本处理、数据分析、用户界面设计等多个方面。在这个"字符串查找和替换的实现例子"中,我们可以推测这是一个简单的应用程序,它可能展示了...

    字符串查找KMP算法

    字符串查找是计算机科学中一个基础且重要的问题,特别是在文本处理、模式匹配和数据搜索等领域有着广泛应用。KMP(Knuth-Morris-Pratt)算法是由Donald Knuth、James H. Morris和 Vaughan Pratt三位学者在1970年代...

    字符串查找_字符串查找_

    在给定的标题“字符串查找_字符串查找_”和描述“将字典中的单词输出并查找包含某一串字符的所有单词”中,我们可以深入探讨字符串查找的概念、方法以及在实际应用中的实现。 首先,字符串查找,简单来说,就是在一...

    字符串查找替换

    在IT领域,字符串查找与替换是编程中非常基础且重要的操作。无论是在文本处理、数据分析还是日志分析等场景中,我们都需要频繁地对字符串进行查找和替换。下面,我们将详细探讨这一主题。 字符串查找通常涉及到查找...

    字符串查找替换.exe

    在IT行业中,字符串查找与替换是一项基础且至关重要的操作,广泛应用于各种软件开发、文本处理、数据分析等场景。"字符串查找替换.exe"很显然是一款专为此目的设计的实用工具,可能是一个命令行程序或者图形用户界面...

    C++字符串查找

    本文将深入探讨C++中的字符串查找这一重要主题,这对于初学者理解和掌握C++编程至关重要。 字符串在C++中是字符数组的特殊形式,它用于存储文本数据。在处理字符串时,我们经常需要查找特定的子串或字符,这是字符...

    文件中的字符串查找替换工具

    在IT行业中,字符串查找与替换是一项基础且至关重要的任务,特别是在文本处理、编程、文档编辑等领域。"文件中的字符串查找替换工具"就是这样一个专门解决这类问题的软件或应用程序。它能够帮助用户快速、批量地在多...

    x86汇编语言文本字符串查找替换程序

    《x86汇编语言实现文本字符串查找与替换程序详解》 在计算机科学领域,汇编语言是一种低级编程语言,它与机器指令密切相关,直接对应于硬件的操作。x86汇编语言是针对Intel 80x86系列处理器家族的,包括现今广泛...

Global site tag (gtag.js) - Google Analytics