求一个效率的找字符串字串的方法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

god_sun 2007-11-14 01:52:21
一个字符串:
“aaaa bbbbbbbb ccccc ddddddddd eeeeeeee” (之间空格数量不定)

char *acFindSubString (CString p_pString, int p_iIdx)
{

}
想写个函数。。
p_pString 为传入的字符串 p_iIdx 为要取得的第几个子串

p_iIdx = 2 就返回 bbbbbbbb
= 4 就返回 ddddddddd

不知道有什么好的方法。。效率高点的
可以用任何api
...全文
676 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
huang_weiwei 2007-11-22
  • 打赏
  • 举报
回复
支持6楼的,可以试试.
csdn5211 2007-11-22
  • 打赏
  • 举报
回复
效率再高也是O(n),没什么提高的潜力啊。
Torch009 2007-11-20
  • 打赏
  • 举报
回复
有没有效率高点的?
caenwang 2007-11-20
  • 打赏
  • 举报
回复
顶 9 楼 !
__________________ 2007-11-20
  • 打赏
  • 举报
回复
用正规表达式啊
krums 2007-11-20
  • 打赏
  • 举报
回复
如果字串没规律的话,KMP已经够用了.
soft78 2007-11-19
  • 打赏
  • 举报
回复
一个个找
zkbuchaladi 2007-11-15
  • 打赏
  • 举报
回复
mark
kahn178 2007-11-15
  • 打赏
  • 举报
回复
字符少的话,这样就可以了,字符很多的话,那就要用到算法了,9楼的朋友,已经说得很清楚了,赞同!!!
ERR0RC0DE 2007-11-15
  • 打赏
  • 举报
回复
这个怎么样?


char* extract(const char *source, int index, char splitterchar, int &len)
{
len = 0;
const char *rc = source;
while (1)
{
rc = source;
if (!index)
break;
while ((splitterchar != *source) && (0 != *source))
source++;
while ((splitterchar == *source) && (0 != *source))
source++;
index--;

if (0 == *source)
return NULL;
}

if (0 == index)
{
const char *t = rc;
while ((splitterchar != *t) && (0 != *t))
{
len++;
t++;
}
}
return (char*)rc;
}
漂流的代码 2007-11-15
  • 打赏
  • 举报
回复
从算法书上学来的KMP方法,一共有四个函数,具体怎么回事,自己也忘了(!_#:
// kmp string search

// forward search

unsigned char* KMPFailureFunc_Forward(const char* p,int m)

{

int i=1,j=0;

unsigned char* tbl = (unsigned char*)malloc(m);

tbl[0] = 0;

while(i<m)

{

if(p[j]==p[i])

{

tbl[i] = j+1;

i++;

j++;

}

else if(j>0)

{

j = tbl[j-1];

}

else

{

tbl[i]=0;

i++;

}

}

return tbl;

}



int KMPMatch_Forward(const char *t,int n,const char* p,int m)

{

int i=0;

int j=0;

int ipos = -1;

unsigned char* tbl = KMPFailureFunc_Forward(p,m);



while(i<n)

{

if(p[j]==t[i])

{

if(j==m-1)

{

ipos = i-m+1;

goto RETURN;

}

i++;

j++;

}

else if(j>0)

{

j = tbl[j-1];

}

else

{

i++;

}

}

RETURN:

free(tbl);

return ipos;

}





//backward search

unsigned char * KMPFailureFunc_Backward(const char* p,int m)

{

int i=m-2,j=m-1;

unsigned char* tbl = (unsigned char*)malloc(m);

tbl[j] = m-1;



while(i>=0)

{

if(p[j]==p[i])

{

tbl[i] = m-j-1;

i--;

j--;

}

else if(j<m-1)

{

j = tbl[j+1];

}

else

{

tbl[i]=m-1;

i--;

}

}

return tbl;

}



int KMPMatch_Backward(const char* t,int n,const char* p,int m)

{

int i=n-1;

int j=m-1;

int ipos = -1;

unsigned char* tbl = KMPFailureFunc_Backward(p,m);



while(i>=0)

{

if(p[j]==t[i])

{

if(j==0)

{

ipos = i;

goto RETURN;

}

i--;

j--;

}

else if(j<m-1)

{

j = tbl[j+1];

}

else

{

i--;

}

}

RETURN:

free(tbl);

return ipos;

}





/////////////////////////////////////

// with upper, no caps

inline char upper(char ch) { return ch>'a'&&ch<'z'?(ch+'A'-'a'):ch; }

// forward search

unsigned char* KMPFailureFunc_Forward_NoCaps(const char* p,int m)

{

int i=1,j=0;

unsigned char* tbl = (unsigned char*)malloc(m);

tbl[0] = 0;

while(i<m)

{

if(upper(p[j])==upper(p[i]))

{

tbl[i] = j+1;

i++;

j++;

}

else if(j>0)

{

j = tbl[j-1];

}

else

{

tbl[i]=0;

i++;

}

}

return tbl;

}



int KMPMatch_Forward_NoCaps(const char *t,int n,const char* p,int m)

{

int i=0;

int j=0;

int ipos = -1;

unsigned char* tbl = KMPFailureFunc_Forward_NoCaps(p,m);



while(i<n)

{

if(upper(p[j])==upper(t[i]))

{

if(j==m-1)

{

ipos = i-m+1;

goto RETURN;

}

i++;

j++;

}

else if(j>0)

{

j = tbl[j-1];

}

else

{

i++;

}

}

RETURN:

free(tbl);

return ipos;

}





//backward search

unsigned char * KMPFailureFunc_Backward_NoCaps(const char* p,int m)

{

int i=m-2,j=m-1;

unsigned char* tbl = (unsigned char*)malloc(m);

tbl[j] = m-1;



while(i>=0)

{

if(upper(p[j])==upper(p[i]))

{

tbl[i] = m-j-1;

i--;

j--;

}

else if(j<m-1)

{

j = tbl[j+1];

}

else

{

tbl[i]=m-1;

i--;

}

}

return tbl;

}



int KMPMatch_Backward_NoCaps(const char* t,int n,const char* p,int m)

{

int i=n-1;

int j=m-1;

int ipos = -1;

unsigned char* tbl = KMPFailureFunc_Backward_NoCaps(p,m);



while(i>=0)

{

if(upper(p[j])==upper(t[i]))

{

if(j==0)

{

ipos = i;

goto RETURN;

}

i--;

j--;

}

else if(j<m-1)

{

j = tbl[j+1];

}

else

{

i--;

}

}

RETURN:

free(tbl);

return ipos;

}
tonyevehello 2007-11-15
  • 打赏
  • 举报
回复
是一个文件包含N条,还是多个文件总共N行,find的效率貌似已经很高了
ppfly2008 2007-11-14
  • 打赏
  • 举报
回复


for(long m = 0; m < 1000000; m++)
{
temp.TrimLeft();
for(int i = num - 1; i > 0; i--)
{
int index = temp.Find(' ');
temp = temp.Right(temp.GetLength() - index - 1);
temp.TrimLeft();
}

temp = temp.Left(temp.Find(' '));
}
cout << "end" << endl;


循环1百W次1秒左右,

如果是你的情况 效率主要体现在文件操作以及IO处理了~

god_sun 2007-11-14
  • 打赏
  • 举报
回复
串不长,,但是有n条这样的串。。一个文件几十条,一天有6w个文件
raptormk16 2007-11-14
  • 打赏
  • 举报
回复
不要告诉我你的串有1G长
ppfly2008 2007-11-14
  • 打赏
  • 举报
回复

CString m_str = "aaaa bbbbbbbb ccccc ddddddddd eeeeeeee";
int num;
cin >> num; // 你的p_iIdx参数

CString temp = m_str; // 你的p_pString

temp.TrimLeft();
for(int i = num - 1; i > 0; i--)
{
int index = temp.Find(' ');
temp = temp.Right(temp.GetLength() - index - 1);
temp.TrimLeft();
}

temp = temp.Left(temp.Find(' '));
cout << (LPCTSTR)temp << endl;


。。。这个不知道效率怎么样?没什么技巧~~
不过短串的话效率是怎么也体现不出来的~~呵呵
shrinerain 2007-11-14
  • 打赏
  • 举报
回复
这个... 本来就只需要遍历一次就好了...

你想要什么样的效率?
何哀何欢 2007-11-14
  • 打赏
  • 举报
回复
一个字一个字的找吧。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧