1、将一句话里的单词进行倒置,以单词为单位。
写了两种方法,第一种借用的辅助空间过大,第二种辅助空间小。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
char* reverseByWords(char* s)
{
char *temp;
int i,j,len;
int newL,oldL,oldR; //newL表示新字符串中左边的指针
//oldL表示老字符串中指向一个单词左边的指针
//oldR表示老字符串中指向一个单词右边的指针
len = strlen(s);
temp = (char*)malloc((len+1) * sizeof(char));
newL = 0;
for(i =len-1 ; i>=0 ;i--)
{
oldR=i;
oldL=i;
while(i>=0 && s[i] != ' ')
{
oldL--;
i--;
}
for(j = oldL+1; j <=oldR; j++,newL++)
{
temp[newL] = s[j];
}
temp[newL ++] = ' ';
}
temp[len] = '\0';
return temp;
}
void reverseTool(char *s,int start,int end)
{
int i,j;
char temp;
i = start;
j = end;
while(i<j)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
void reverseByWords2(char *s)
{
int i,j,len;
len = strlen(s);
reverseTool(s,0,len-1);
i=0;j=0;
while(j<len)
{
while(s[j] != ' ' && j<len)
j++;
reverseTool(s,i,j-1);
j++;
i = j;
}
}
void main()
{
char s[] = "i come from tian jin."; //不可以用*s定义,因为*s只能修改s 而不能修改*s
char *p;
reverseByWords2(s);
printf("%s \n",s);
p = reverseByWords(s);
printf("%s \n",p);
}
2、求字符串中出现次数最多的子串。
基本算法描述:
给出一个字符串abababa
1.穷举出所有的后缀子串
substrs[0] = abababa;
substrs[1] = bababa;
substrs[2] = ababa;
substrs[3] = baba;
substrs[4] = aba;
substrs[5] = ba;
substrs[6] = a;
2.然后进行比较
substrs[0]比substrs[1]多了一个字母,如果说存在连续匹配的字符,那么
substrs[0]的第1个字母要跟substrs[1]首字母匹配,同理
substrs[0]的前2个字母要跟substrs[2]的前2个字母匹配(否则不能叫连续匹配)
substrs[0]的前n个字母要跟substrs[n]的前n个字母匹配.
如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串.
#include <iostream>
#include <string>
#include<vector>
using namespace std;
void main(){
string s = "abababa";
string result;
int len = s.length();
int count;
int maxCount = 1;
vector<string> substrs;
for(int i = 0 ; i <len ; i ++){
substrs.push_back(s.substr(i,len-i));
}
for(i=0;i<len;i++){
for(int j=i+1;j<len;j++){
count = 1;
if(substrs[i].substr(0,j-i) == substrs[j].substr(0,j-i)){
count++;
for(int k=j+(j-i);k<len;k+=j-i){
if(substrs[k].substr(0,j-i) == substrs[j].substr(0,j-i)){
count++;
}else{
break;
}
}
if(count > maxCount){
maxCount = count;
result = substrs[j].substr(0,j-i);
}
}
}
}
cout<<result<<endl;
cout<<maxCount<<endl;
}