1 .1 字符串的旋转
题目描述:
给定一个字符串,要求将字符串前面的若干个字符串移到字符串的尾部。例如,将字符串“abcdef”的前三个字符‘a’、‘b’,‘c’移到字符串的尾部,那么原字符串将变成“defabc”。请写一个函数实现此功能。
解法一:蛮力移位,需要移动字符一个一个的移动到字符串的尾部。
void leftShiftOne(char* s, int n)
{
char t = s[0];
for(int i=1; i<n; i++)
{
s[i-1]=s[i];
}
s[n-1]=t;
}
char Roatechar(char *s, int n, int m)
{
while(m--)
{
leftShiftOne(s,n);
}
}
解法二:三步反转
主要思想就是借助旋转函数,以及局部旋转和整体旋转的巧妙应用,达到最后的整体的字符串的旋转的结果。
第一步:由于m=3,可将原来的字符串分成两个部分,即“abc”和“def”。
第二步:局部旋转,即将“abc”变成“cba”和“def”变成“fed”,故整个字符串将变成为“cbafed”。
第三步:整体旋转,即“cbafed”变成“defabc”.
关键二等一步就是定义一个旋转函数,即镜面旋转,180度旋转。投叫互换的思想。
旋转函数的定义如下:
char rotateChar( char *s, int from, int to)
{
while(from<to){
char t=s[from];
s[from++]=s[to];
s[to--]=t;
}
}
故主函数:
char ShiftM(char *s, int n, int m)
{
m %= n;//若要左移大于n为,那么与%n是等价的。
rotateChar(s, 0, m-1);
rotateChar(s, m, n-1);
rotateChar(s, 0, n-1);
}
举一反三:单词翻转
题目描述:输入一个英文句子,翻转句子中单词的顺序。要求单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入:“I am a student.”,则输出“student. a am I”。
主要思想:
第一步就是整体翻转,即“I am a student.”变成“.tneduts a ma I”。
第二步就是局部翻转,即".tneduts"变成“student.”, “ma”变成“am”。
关键在于找空格符时,起始符和停止符两个的定位。
class Solution {
public:
string ReverseSentence(string str) {
int len = str.length();
if(len == 0) return "";
int begin=0;
int end=0;
Reverse(str,0,len-1);
begin=end=0;
while(str[begin]!='\0')
{
if(str[begin]==' ')
{
begin++;
end++;
}
else if(str[end]==' '||str[end]=='\0')
{
Reverse(str,begin,--end);
begin=++end;
}
else end++;
}
return str;
}
void Reverse(string &str,int begin,int end){
while(begin < end){
swap(str[begin++],str[end--]);
}
}
};
1.2字符串的包含
题目描述:
给定一个长字符串a和一短字符串b。请问, 如何最快的判断出短字符串b中的所有字符是否都在长字符串a中?请编写函数bool StringContain( string &a, string &b)实现此功能。
为简单起见,假设输入的字符串只包含大写英文字母。下面举几个例子。
假设a为“ABCD”,b的情况如下:
1“BAD”,真
2“BCE”,假
3“AA”,真
举一反三
变位词
题目描述:如果两个字符串的字符一样,出现次数也一样,只是出现的顺序不一样,则认为这两个字符串是兄弟字符串。例如,“bad”和”abd”即为兄弟字符串。现在提供一个字符串,请问如何在字典中迅速找到它的兄弟字符串?