字符串
/*
字符串的旋转
给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部。例如,将字符串
"abcdef"的前3个字符'a','b','c'移到字符串的尾部,那么原字符串将变成'defabc',
请写一个函数实现此功能。
*/
/*
思路:
定义一组字符串,调用两个函数,一个将一个字符移到末尾,
另一个调用若干次使得需要移到的若干个字符移动到字符串
尾部。
*/
#include<iostream>
#include<string>
using namespace std;
void LeftShifOne(string &s,int n)//调用函数将一个字符移到尾部
{
char t=s[0];//保存首字符
for(int i=1;i<n;i++)
s[i-1]=s[i];
s[n-1]=t;
}
void LeftRotatestring(string &s,int n,int m)//调用函数m次,使得m个字符移到字符串尾部
{
while(m--)
{
LeftShifOne(s,n);
}
cout<<s<<endl;
}
int main()
{
string s;//定义字符串
int n,m;//定义字符串的长度,移动的长度
cin>>s>>m;
n=s.length();//字符串的长度
LeftRotatestring(s,n,m);//调用函数
return 0;
}
/*
最大连续乘积子数组
给定一个浮点数组,任意取出数组中的若干个连续的数相乘,
请找出其中乘积最大的子数组的积。例如,给定数组{-2.5,4,
0,3,0.5,8,-1},则取出的最大乘积子数组为{3,0.5,8},那么最大的乘积为12.
*/
/*
思路:
问题可以简化为:在数组中找到一个子数组,使得它的乘积最
大,同时再找到另一个子数组,使得它的乘积最小(含有负数情
况),也就是说不但需要记录最大乘积也需要记录最小乘积。
*/
#include<iostream>
using namespace std;
double maxstring(double *s,int length)
{
double maxend=s[0];
double minend=s[0];
double maxresult=s[0];
for(int i=1;i<length;i++)
{
double end1=maxend*s[i],end2=minend*s[i];
maxend=max(max(end1,end2),s[i]);
minend=min(min(end1,end2),s[i]);
maxresult=max(maxresult,maxend);
}
return maxresult;
}
int main()
{
double s[100],length;
cin>>length;
for(int i=0;i<length;i++)
cin>>s[i];
cout<<maxstring(s,length)<<endl;
return 0;
}
/*
字符串的查找
假设现在有这样一个问题:有一个文本串S和一个模式串P,
要查找P在S中的位置(第一个字符的位置)
*/
/*
思路:
定义两组一维数组,如果当前字符匹配成功,则继续匹配下
一个字符;如果匹配失败则一个回溯,一个被置为0.倘若所
有都匹配成功则返回最初第一个字符位置,否则则返回-1.
*/
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a,b;
int i,j;
cin>>a>>b;
while(i<a.length() && j<b.length() )
{
if(a[i]==b[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==b.size())
cout<<i-j<<endl;
else
cout<<-1<<endl;
return 0;
}