[C语言]字符串的各种问题
2012-08-06 00:20
375 查看
1、将一句话里的单词进行倒置,以单词为单位。
写了两种方法,第一种借用的辅助空间过大,第二种辅助空间小。
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<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; }
相关文章推荐
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- 字符串的组合算法问题的C语言实现攻略
- C语言编写字符串拷贝函数应注意的几个问题
- 关于c语言字符串中sizeof指针的问题
- Qt中的各种字符串转换问题
- C语言字符串、指针和内存问题总结
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
- 关于C语言中用scanf语句输入带有空格字符串问题
- 关于C语言中printf输出字符串的问题!字符串须以'\0'作为结尾。
- c语言字符串和指针十个问题
- 顺序表实现之C语言(附加各种顺序表排序问题)
- C语言读取文本文件字符串内容不对,可能是文本编码问题
- C语言关于字符串操作的安全问题
- c语言字符串排序问题
- C语言实现字符串中把空格换成%20问题
- 使用C语言解决字符串全排列问题
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- c语言 char*类型作为中间变量将许多字符串保存到一个数组的问题
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
- 关于c语言中的字符串的问题