C++字符串编程面试题常见题目源程序

本文提供了四个C++字符串编程题目,包括寻找连续出现次数最多的子串、找到最长重复子串、实现strstr函数和单词倒置。示例代码在VS2008上已通过调试,供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文中主要对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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值