本文中主要对C++面试题中的几个主要的关于string的编程题写出来与大家分享,在VS2008上面全部调试通过,大家可以放心参考。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//求一个字符串中连续出现次数最多的子串
pair<int,string> fun(const string &str)
{
vector<string> substrs;
int maxcount=1,count=1;
string substr;
int i,len=str.length();
for (i=0;i<len;++i)
{
substrs.push_back(str.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[i].substr(0,j-i)==substrs[k].substr(0,j-i))
{
++count;
}
else
{
break;
}
}
if (count>maxcount)
{
maxcount=count;
substr=substrs[i].substr(0,j-i);
}
}
}
}
return make_pair(maxcount , substr);
}
//输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置
void maxLength(string src)
{
string temp;
for (int i=src.length()-1;i>1;i--)
{
for (int j=0;j<src.length();j++)
{
if (i+j<=src.length())
{
size_t t=0;
size_t num=0;
temp=src.substr(j,i);//从大到小取子串
t=src.find(temp);//查找第一个与待查找字符串相同的字符串的开始位置
num=src.rfind(temp);//最后一个与带查找字符串相同的字符串的开始位置
if(t!=num)
{
cout<<temp<<" "<<t+1<<endl;
}
}
}
}
}
//实现strstr的功能,返回主串中字符子串的位置以后的所有字符
const char* strstr1(const char* str1,const char* str2)
{
for (int i=0;str1[i]!='\0';i++)
{
int j=0,temp=i;
if (str1[i]==str2[j])
{
while (str1[i++]==str2[j++])
{
if (str2[j]=='\0')
{
return &str1[i-j];
}
}
i=temp;
}
}
return NULL;
}
//讲一句话中的单词进行倒置,标点符号不倒置,如:i come from tianjin.->tianjin. from come i
void inverse(char *ch)
{
int i=0,j=0,begin=0,end=0;
char temp;
j=strlen(ch)-1;
char str[100];
strcpy(str,ch);
cout<<"source is:"<<str<<endl;
while (j>i)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
j--;
i++;
}
cout<<"inverse is:"<<str<<endl;
i=0;
while(str[i])
{
if (str[i]!=' ')
{
begin=i;
while (str[i]&&str[i]!=' ')
{
i++;
}
i-=1;
end=i;
}
while (end>begin)
{
temp=str[begin];
str[begin]=str[end];
str[end]=temp;
end--;
begin++;
}
i++;
}
cout<<"particle inverse is:"<<str<<endl;
}
//字符串转换问题:原来字符串中的字符+该字符串连续出现的次数:如:1233422222-》1121324125
void transfer(string str)
{
int len=str.length();
char rechar[50];
rechar[0]='\0';
int count=1;
int k;
for (k=0;k<=len-1;k++)
{
if (str[k+1]==str[k])
{
count++;
}
else
{
sprintf(rechar+strlen(rechar),"%c%d",str[k],count);
count=1;
}
}
cout<<"the transfer string is : "<<rechar<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
string str="abcbcbcabc";
string a=str.substr(0,3);
pair<int,string> rs;
rs=fun(str);
cout<<rs.second<<':'<<rs.first<<'\n';
//while (cin>>str)
//{
// rs=fun(str);
// cout<<rs.second<<':'<<rs.first<<'\n';
//}
string temp="yyabcdabjcabceg";
maxLength(temp);
const char *strs=strstr1("123456789","345");
cout<<strs<<endl;
char ch[]="i come from tianjin.";
inverse(ch);
string num="1233422222";
transfer(num);
return 0;
}