1.1 字符串的旋转+1.2 字符串的包含

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”即为兄弟字符串。现在提供一个字符串,请问如何在字典中迅速找到它的兄弟字符串?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值