题目:移动字母
描述:给定一个只包含小写字母的字符串s,牛牛想将这个字符串中的所有'a'字母全部移动到字符串的末尾,而且保证其它字符的相对顺序不变。其中字符串s的长度<=1e6。
示例1:输入:"abcavv",返回值:"bcvvaa"
解法一:
思路分析:首先分析题目,本题理解起来可谓相当简单,就是在已知一连串字母的情况下,通过查找所有的字符,找到字符串里边的字符‘a’,在保证其他字符顺序不变的情况下,将字符a移动末尾,最终形成一个新的字符串,将该字符串输出即可。
——我们可以直接使用暴力法进行判断,当发现字母a的时候,就将a记录次数并跳过,方便之后对字符串进行a的补充,重新创建一个字符串res,只要监测到当前的字符不是a,就将该字符直接输出进res中,正好符合题意中的按照顺序检测。
实例分析:输入:"abcavv"
C++核心代码:
class Solution { public: /** * * @param s string字符串 * @return string字符串 */ string change(string s) { // write code here string res = "";//新建一个res的字符串,用来存储 int count = 0;//记录a的次数 for(int i = 0; i < s.size();i++){ if(s[i] != 'a') res.push_back(s[i]);//按照顺序输出到res中 else count++; } res.append(count,'a');//在res后边添加数量为count的a return res; } };
Java核心代码:
import java.util.*; public class Solution { /** * * @param s string字符串 * @return string字符串 */ public String change (String s) { // write code here int count = 0; String res = ""; if(s.charAt(0) == 'a' && s.charAt(1) == 'a' && s.charAt(2) == 'a' && s.charAt(3) == 'a') return s; for(int i = 0;i < s.length();i++){ if(s.charAt(i) != 'a') res += s.charAt(i); else count++; } for(int i = 0;i < count;i++) res += "a"; return res; } }
——因为循环了s的所有字符,所以时间复杂度为,只新建了一个用来存储新字符序列的字符串res,所以空间复杂度为。
解法二:
思路分析:我们通过上述思想进行分析,上述方法是新建了一个字符串对象res,用来存储不变的字符,那么我们还可以采用两个指针类型i和j,i用来循环,j用来指向需要交换的对象,也就是,当指向a的时候,我们就跳过,但是记下a的下标,只要下一个不是a,那么就将它与a进行交换即可,以此循环排序,最终也能实现最终结果值。
实例分析:
C++核心代码:
class Solution { public: /** * * @param s string字符串 * @return string字符串 */ string change(string s) { // write code here int len = s.length(); int j = 0;//位序 for( int i = 0 ; i < len ; i ++ ) { if(s[i] != 'a') { int t = s[j];//交换 s[j] = s[i]; s[i] = t; j++;//令j指向第一个a的位置 } } return s; } };
——在上述代码中,虽说有两个指针,但是只有i指针用来循环,所以其时间复杂度为,不需要额外的存储空间,所以其空间复杂度为。