在我尝试理解已经存在于互联网上并且非常失败之后,我想出了这个用于匹配精确字符串的算法:P任何人都可以告诉我,与现有算法相比,这是快还是慢?
#include <iostream>
#include<cstring>
using namespace std;
int main(){
int i=0;
int j=0;
int foo=0;
string str;
string needle;
cin>>str;
cin>>needle;
int * arr = NULL;
int * arr2 = NULL;
int * match = NULL;
arr = new int [str.length()];
int x=0, y = 0, z = 0;
int n=0; char a, b;
cout<<"\nStep 1: ";
for(i=0;i<str.length();i++){
if(str[i]==needle[0]){
arr[x]=i; x++;
cout<<i<<" ";
}
}
arr[x]=str.length(); x++; cout<<"\nStep 2: ";
if(x){
arr2 = new int [x];
for(i=0;i<x-1;i++){
if(arr[i+1]-arr[i]>=needle.length()){
arr2[y]=arr[i]; y++;
cout<<arr[i]<<" ";
}
}
delete[]arr; cout<<"\nStep 3: ";
if(y){
match = new int [y];
for(i=0;i<y;i++){
n=arr2[i];
for(j=0;j<needle.length(); j++){
a=str[n+j]; b=needle[j];
if(a==b){
foo=1;
}
else{
foo=0; break;
}
}
if(foo){
match[z]=n; z++;
cout<<n<<" ";
}
}
delete[]arr2;
if(z){
cout<<"\n\nMatches: ";
for(i=0;i<z;i++){
cout<<match[i]<<" ";
}
}
}
}
return 0;
}
答案 0 :(得分:3)
&#34;任何人都可以告诉我这是否足够有效......&#34;
不,因为您还没有描述将要使用该方法的上下文。在某些情况下,它肯定会足够有效。在其他人中,可能不是。
这不是一个滑稽的答案。有一个真正的观点:
效率本身很少是一个目标,在大多数情况下,特定代码段的效率在现实世界编程中几乎没有真正的重要性。
编写简单,正确的代码通常更好,只有在测量性能并分析应用程序以识别热点时才会担心微观级别的效率。
现在,如果您对字符串搜索算法的性能感兴趣,那么我建议您首先查看this Wikipedia article汇总(和链接)一些高级字符串搜索算法。
答案 1 :(得分:-1)
你不能这样使用它:
arr = new int [str.length()]
它会给你一个编译时错误。但是你可以在Java中使用它。