这个算法对很多人来说比较简单,想起去年去参加面试时,要求在纸上写这个算法,对当初我这个只懂C++语法,没接触过算法和数据结构的新手来说,思路自然是天马行空,记得当时的想法是把每个小串(那个时候没学习过数据结构,不知道子串这个名字)的头指针放到一个数组中,然后数组逆输,现在想起来,那时候之所以有如此天马行空的想法,是因为对常用的数据结构和算法不熟悉,不知道这个题目是想考察什么。
无非是字符串的逆序和查找子串。
算法如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
void Inverse(char* s,int l)
{
char* ph=s,*pend=s+l-1;
char c;
while(ph<pend)
{
c=*ph;
*ph=*pend;
*pend=c;
ph++;
pend--;
}
return;
}
void SonStr(char* s)
{
char* p=s,*str=s;
int i=0;
Inverse(str,strlen(s));
while(*p!='\0')
{
i=0;
str=p;
while(*p!=' ' && *p!='\0')
{
p++;
i++;
}
Inverse(str,i);
if(*p!='\0')
p++;
}
return;
}
int main(int argc, char* argv[])
{
char str[]="A Delay-Constrained Bandwidth Inversion Routing Algorithm";
SonStr(str);
cout<<str<<endl;
return 0;
}
函数
void Inverse(char* s,int l) T(N)=O(n),是个线性规模
void SonStr(char* s) T(N)=O(n),也是个线性规模
需要注意的是,不要企图对字符串常量做这件事,其一,因为是常量,所以去改变它没有意义 其二,字符串常量也不可能在原地改变。