Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 子串算法_String_Algorithm_Search_Substring - Fatal编程技术网

String 子串算法

String 子串算法,string,algorithm,search,substring,String,Algorithm,Search,Substring,有人能给我解释一下如何迭代求解子串问题吗 问题:给定两个字符串S=S1S2S3…Sn和T=T1T2T3…Tm,m小于或等于n,确定T是否是S的子字符串。下面是一个 根据您的需要,不同的算法可能更适合您,但这是一个流行的选择。它会是这样的: m==0? return true cs=0 ct=0 loop cs>n-m? break char at cs+ct in S==char at ct in T? yes: ct=ct+1 ct

有人能给我解释一下如何迭代求解子串问题吗

问题:给定两个字符串S=S1S2S3…Sn和T=T1T2T3…Tm,m小于或等于n,确定T是否是S的子字符串。

下面是一个


根据您的需要,不同的算法可能更适合您,但这是一个流行的选择。

它会是这样的:

m==0? return true
cs=0
ct=0
loop
    cs>n-m? break
    char at cs+ct in S==char at ct in T?
    yes:
        ct=ct+1
        ct==m? return true
    no:
        ct=0
        cs=cs+1

end loop
return false
if(T==string.Empty)返回true;

例如(int i=0;i不确定您使用的是哪种语言,但这里有一个C#的示例。这是一个大致为n2的算法,但它可以完成任务

bool IsSubstring (string s, string t)
{
   for (int i = 0; i <= (s.Length - t.Length); i++)
   {
      bool found = true;

      for (int j = 0; found && j < t.Length; j++)
      {
         if (s[i + j] != t[j])
             found = false;
      }

      if (found)
         return true;
   }

   return false;
}
bool IsSubstring(字符串s、字符串t)
{

对于(int i=0;i而言,一个简单的算法是在每个位置0
这可能与上面列出的子字符串算法是多余的,但我总是被KMP(–Morris–Pratt_算法)逗乐。

这是我的PHP变体,其中包括一个检查,以确保在搜索过程中指针不会超过干草堆的长度

<?php

function substring($haystack,$needle) {
        if("" == $needle) { return true; }
        echo "Haystack:\n$haystack\n";
    echo "Needle:\n$needle\n";

        for($i=0,$len=strlen($haystack);$i<$len;$i++){
                if($needle[0] == $haystack[$i]) {
                        $found = true;
                        for($j=0,$slen=strlen($needle);$j<$slen;$j++) {
                                if($j >= $len) { return false; }
                                if($needle[$j] != $haystack[$i+$j]) {
                                        $found = false;
                                        continue;
                                }
                        }
                        if($found) {
                                echo " . . . . . . SUCCESS!!!! startPos: $i\n";
                                return true;
                        }
                }
        }
        echo " . . . . . . FAILURE!\n" ;
        return false;
}

assert(substring("haystack","hay"));
assert(!substring("ack","hoy"));
assert(substring("hayhayhay","hayhay"));
assert(substring("mucho22","22"));
assert(!substring("str","string"));
?>

在一些回音中留下。如果它们冒犯了您,请删除!

//在最佳情况下运行O(n),其中不匹配,在最坏情况下运行O(n2),其中字符串匹配
// runs in best case O(n) where no match, worst case O(n2) where strings match

var s = "hippopotumus"
var t = "tum"

for(var i=0;i<s.length;i++)
    if(s[i]==t[0])
        for(var ii=i,iii=0; iii<t.length && i<s.length; ii++, iii++){
            if(s[ii]!=t[iii]) break
            else if (iii==t.length-1) console.log("yay found it at index: "+i)
        }
var s=“河马” var t=“tum” for(var i=0;i是一种
O(n*m)
算法,其中nm是每个字符串的大小。 在C#中,它类似于:

   public static bool IsSubtring(char[] strBigger, char[] strSmall)
        {
            int startBigger = 0;
            while (startBigger <= strBigger.Length - strSmall.Length)
            {
                int i = startBigger, j = 0;

                while (j < strSmall.Length && strSmall[j] == strBigger[i])
                {
                    i++;
                    j++;
                }

                if (j == strSmall.Length)
                    return true;
                startBigger++;
            }

            return false;
        }
publicstaticboolsissubtring(char[]strBigger,char[]strSmall)
{
int startBigger=0;

虽然(startBigger这是一篇很老的帖子,但我正在尝试回答它。如果有什么问题,请纠正我

package com.amaze.substring;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CheckSubstring {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Please enter the main string");
    String mainStr = br.readLine();

    System.out.println("Enter the substring that has to be searched");
    String subStr = br.readLine();

    char[] mainArr = new char[mainStr.length()];
    mainArr = mainStr.toCharArray();
    char[] subArr = new char[subStr.length()];
    subArr = subStr.toCharArray();
    boolean tracing = false;
    //System.out.println("Length of substring is "+subArr.length);
    int j = 0;

    for(int i=0; i<mainStr.length();i++){

        if(!tracing){
            if(mainArr[i] == subArr[j]){
                tracing = true;
                j++;
            }
        } else {
            if (mainArr[i] == subArr[j]){
                //System.out.println(mainArr[i]);
                //System.out.println(subArr[j]);
                j++;
                System.out.println("Value of j is "+j);
                if((j == subArr.length)){
                    System.out.println("SubString found");
                    return;
                }
            } else {
                j=0;
                tracing = false;
            }
        }
    }

    System.out.println("Substring not found");

}

}
package com.amaze.substring;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
公共类校验子串{
/**
*@param args
*@抛出异常
*/
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
System.out.println(“请输入主字符串”);
字符串r=br.readLine();
System.out.println(“输入必须搜索的子字符串”);
字符串subStr=br.readLine();
char[]mainArr=新字符[mainStr.length()];
mainArr=mainStr.toCharArray();
char[]subar=新字符[subStr.length()];
subbr=subStr.toCharArray();
布尔跟踪=假;
//System.out.println(“子字符串的长度为”+子字符串长度);
int j=0;

对于(int i=0;i我知道我比赛迟到了,但这是我的版本(用C#表示):

bool isSubString(字符串子字符串、字符串上字符串)
{

对于(int x=0;x)几乎相同的问题和答案,我是唯一一个反对解决别人家庭作业的人吗(continue在这里看起来是多余的OK修复了它。但是一个好的编译器无论如何都不会有什么不同。你在你的第一个
for
循环中有一个fencepost错误,条件应该是
i Oh,如果t是空字符串(空字符串是任何其他字符串的子字符串),你的逻辑也会失败)。对于
m==0
(空字符串是任何其他字符串的子字符串)的情况,此操作也会失败。这应该是
ct==m
not
n
。它也属于其他几个答案的相同问题-如果
T
是空字符串,则返回false,这是不正确的。
break;
after
found=false;
将降低复杂性Alice-不必要;它是for循环的循环条件的一部分。The事实上,这种方法检查的是不平等而不是平等,这让我感到困惑。这种方法有什么好处吗?
// runs in best case O(n) where no match, worst case O(n2) where strings match

var s = "hippopotumus"
var t = "tum"

for(var i=0;i<s.length;i++)
    if(s[i]==t[0])
        for(var ii=i,iii=0; iii<t.length && i<s.length; ii++, iii++){
            if(s[ii]!=t[iii]) break
            else if (iii==t.length-1) console.log("yay found it at index: "+i)
        }
   public static bool IsSubtring(char[] strBigger, char[] strSmall)
        {
            int startBigger = 0;
            while (startBigger <= strBigger.Length - strSmall.Length)
            {
                int i = startBigger, j = 0;

                while (j < strSmall.Length && strSmall[j] == strBigger[i])
                {
                    i++;
                    j++;
                }

                if (j == strSmall.Length)
                    return true;
                startBigger++;
            }

            return false;
        }
package com.amaze.substring;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CheckSubstring {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Please enter the main string");
    String mainStr = br.readLine();

    System.out.println("Enter the substring that has to be searched");
    String subStr = br.readLine();

    char[] mainArr = new char[mainStr.length()];
    mainArr = mainStr.toCharArray();
    char[] subArr = new char[subStr.length()];
    subArr = subStr.toCharArray();
    boolean tracing = false;
    //System.out.println("Length of substring is "+subArr.length);
    int j = 0;

    for(int i=0; i<mainStr.length();i++){

        if(!tracing){
            if(mainArr[i] == subArr[j]){
                tracing = true;
                j++;
            }
        } else {
            if (mainArr[i] == subArr[j]){
                //System.out.println(mainArr[i]);
                //System.out.println(subArr[j]);
                j++;
                System.out.println("Value of j is "+j);
                if((j == subArr.length)){
                    System.out.println("SubString found");
                    return;
                }
            } else {
                j=0;
                tracing = false;
            }
        }
    }

    System.out.println("Substring not found");

}

}
    bool isSubString(string subString, string supraString)
    {
        for (int x = 0; x <= supraString.Length; x++)
        {
            int counter = 0;
            if (subString[0] == supraString[x]) //find initial match
            {
                for (int y = 0; y <= subString.Length; y++)
                {
                    if (subString[y] == supraString[y+x])
                    {
                        counter++;
                        if (counter == subString.Length)
                        {
                            return true;
                        }
                    } 
                }
            }
        }
        return false;
    }