String 子串算法
有人能给我解释一下如何迭代求解子串问题吗 问题:给定两个字符串S=S1S2S3…Sn和T=T1T2T3…Tm,m小于或等于n,确定T是否是S的子字符串。下面是一个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
根据您的需要,不同的算法可能更适合您,但这是一个流行的选择。它会是这样的:
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)
算法,其中n和m是每个字符串的大小。
在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
notn
。它也属于其他几个答案的相同问题-如果T
是空字符串,则返回false,这是不正确的。break;
afterfound=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;
}