您的位置:首页 > 编程语言 > C语言/C++

[C语言]字符串的各种问题

2012-08-06 00:20 375 查看
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个字母匹配.

如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串.

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐