题目链接:https://leetcode.cn/problems/merge-strings-alternately/
题目描述:
给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
示例 1:
输入:word1 = “abc”, word2 = “pqr”
输出:“apbqcr”
解释:字符串合并情况如下所示:
word1: a b c
word2: p q r
合并后: a p b q c r
示例 2:
输入:word1 = “ab”, word2 = “pqrs”
输出:“apbqrs”
解释:注意,word2 比 word1 长,“rs” 需要追加到合并后字符串的末尾。
word1: a b
word2: p q r s
合并后: a p b q r s
示例 3:
输入:word1 = “abcd”, word2 = “pq”
输出:“apbqcd”
解释:注意,word1 比 word2 长,“cd” 需要追加到合并后字符串的末尾。
word1: a b c d
word2: p q
合并后: a p b q c d
提示:1 <= word1.length, word2.length <= 100
word1 和 word2 由小写英文字母组成
class Solution {
public:
string mergeAlternately(string word1, string word2) {
int len1=word1.length();
int len2=word2.length();
string s;
int max=len1;
if(len1<len2) max=len2;
for(int i=0;i<max;i++){
if(i>=len1){
for(int k=i;k<len2;k++){
s.push_back(word2[k]);
}
return s;
}else if(i>=len2){
for(int k=i;k<len1;k++){
s.push_back(word1[k]);
}
return s;
}
s.push_back(word1[i]);
s.push_back(word2[i]);
}
return s;
}
};
思路:直接根据字符串长短,在一个循环里插入,时间复杂度为2n,当把两者都有的长度的数据都插入时,在循环内部插入另一个未插完的字符,当结束时直接返回字符串,即可跳出所以不必要的循环
解题遇到的问题:向字符串中插入指定字符时,可以使用s.push_back()进行添加,s.append()可以在指定位序或指定字符串的个数时使用。在开始写时,将
s.push_back(word1[i]);
s.push_back(word2[i]);
放到了两个判断语句之前,那么当其中一个字符超出自身长度时,会在插入时插入一个[],后改正后,发现一个样例过不去,纠察代码发现判断语句的循环中写入的是k+1,因为之前将插入放在了判断前,所以会将不超过自身长度的数据插入进去,但是如果将判断放在前面,那么当一个超出自身长度时,未超过长度的那一个将会跳过k=i这个数据,改正后代码AC。
代码优化:可以将判断二者长度改为直接插入二者字符串,设置两个变量分别记录每个字符串对应的位数,一方结束则直接舍弃
class Solution {
public:
string mergeAlternately(string word1, string word2) {
int len1=word1.length();
int len2=word2.length();
int i=0;
int j=0;
string s;
while(i<len1||j<len2){
if(i<len1) s.push_back(word1[i++]);
if(j<len2) s.push_back(word2[j++]);
}
return s;
}
};
仅凭结果而已,反向优化了,但是从代码可读性和简洁性来说,提高了很。刚开始写时没加while里的if判断,导致会出现数组越位的错误