Leetcode_12 天编程能力入门_day8

3 个字符串相关的题。

1768. Merge Strings Alternately

Analysis

交替合并字符串,多出来的字符放到末尾即可,这个题有点类似合并链表的题目。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
string mergeAlternately(string word1, string word2) {
string ret;
int i = 0, j = 0;
while(i < word1.length() && j < word2.length()) {
ret += i <= j ? word1[i++] : word2[j++];
}
while(i < word1.length()) ret += word1[i++];
while(j < word2.length()) ret += word2[j++];
return ret;
}
};

不过,这样写好像不是那么优雅,改一下:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
string mergeAlternately(string word1, string word2) {
string ret;
int i = 0, j = 0;
while(i < word1.length() || j < word2.length()) {
if(i < word1.length()) ret += word1[i++];
if(j < word2.length()) ret += word2[j++];
}
return ret;
}
};

1678. Goal Parser Interpretation

Analysis

简单的分词器,按照不同的情况判断就好。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
string interpret(string command) {
string ret;
int i = 0;
while(i < command.length()) {
if(command[i] == 'G') {
ret += "G";
i++;
} else if(command[i] == '(' && command[i + 1] == ')') {
ret += "o";
i += 2;
} else {
ret += "al";
i += 4;
}
}
return ret;
}
};

389. Find the Difference

Analysis

找出字符串 t 中多出的字母即可。

Code

method 1

直接散列。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
char findTheDifference(string s, string t) {
int letters[26] = {0}, i = 0;
while(i < s.length()) letters[s[i++] - 'a']++;
i = 0;
while(i < t.length()) {
int tmp = --letters[t[i++] - 'a'];
if(tmp < 0) break;
}
return t[--i];
}
};

method 2

当然也可以不使用散列,只需要将 2 个字符串字符的和求出做差,即可得到需要的结果。

1
2
3
4
5
6
7
8
9
class Solution {
public:
char findTheDifference(string s, string t) {
int sum1 = 0, sum2 = 0;
for(char ch: s) sum1 += ch;
for(char ch: t) sum2 += ch;
return sum2 - sum1;
}
};

之所以能这么干,是因为 ASCII 码本身就是以整数的形式存储的。

method 3

既然知道了 ASCII 码是整数形式存储的,那么这个问题就转化为了,寻找只出现一次的数,就可以利用位运算来完成了。

1
2
3
4
5
6
7
8
9
class Solution {
public:
char findTheDifference(string s, string t) {
char ret = 0;
for(char ch: s) ret ^= ch;
for(char ch: t) ret ^= ch;
return ret;
}
};

Summary

简单的字符串相关题目,做起来丝毫不废劲啊...不过还是要注意一下一题多解的情况,尽量开阔自己的思路,要能想到其他更优秀的解法。


Buy me a coffee ? :)
0%