字符串在当今的编程中是无处不在的,脚本,web开发,生物信息学中都有广泛的应用。我们需要知道字符串是如何在内存中表示的,并理解字符串的基本操作,像比较,拷贝,链接,分解,匹配等等。
这里我们只讨论可以用基础的方法解决的字符串问题,高级的字符串处理算法经常用到哈希表和动态规划。
字符串的基本方法有append("Gauss"), push_back('c'), pop_back(), insert(s.begin() + shift, "Gauss"), substr(pos, len), compare("Gauss")。
与数组类似,字符串问题常常会有O(n)的空间复杂度的简单粗暴的解法,但是更精妙的解法就是运用字符串本身减小空间复杂度到O(1)。
从前面更新一个可变字符串是很慢的,所以要看是否可以从后面写入。
请记住字符串和数组的组织方式是类似的。对它从后面进行操作性能会更好,例如push_back('c')和pop_back(),但是在中间的操作性能会很差,例如insert(A.begin() + middle, "Gauss")。
比较操作符<, <=, >, >= 和 == 可以用在字符串上,==是逻辑相等,而不是指针相等。
字符串相关问题:
1. 字符串与整数之间的互相转换:
实现字符串/整数的相互转换的方法。
提示:建立结果时,每次一个数字位。
2. 基转换:
输入一个字符串,两个整数b1和b2。字符串代表了以b1为基的整数。需要输出以b2为基的这个整数的字符串。例如如果字符串是"615", b1是7,b2是13,则结果应该是"1A7",因为6*7*7+1*7+5 = 1*13*13+10*13+7。
提示:哪个基是容易来回转换的?
3. 计算电子表格列编码:
电子表格经常用字母表编码连续的列。具体地说,列被表示为:"A", "B", "C", ..., "X", "Y", "Z", "AA", "AB", ..., "ZZ", "AAA", "AAB", ...
实现一个把列id转换为相应整数的方法,"A"对应着1。例如,对于"D"应该返回4,对于"AA"应该返回27,对于"ZZ"应该返回702。我们应该如何测试我们的代码?
提示:["A", "Z"]中有26个字符,每一个都可以被映射为一个整数。
4. 替代与移除:
给定一个字符数组,移除每一个'b',把每一个'b'替换为两个'd'。假设数组有足够的空间来装最后的结果。
提示:考虑多次穿过s。
5. 测试回文性:
给定一个字符串s,判断s是否为回文的。
提示:用两个index。
6. 反转一句话中所有的单词:
给定一个字符串包含一个由空格分开的单词集合,我们需要反转里面的单词,并返回变形后的字符串。
提示:一次遍历很难解决这个问题。
7. 计算电话号码的所有记忆法:
单词要比数字更容易记住。
给定一个电话号码,以字符串的形式,返回所有的与电话号码对应的字符序列。
提示:运用迭代。
8. Look-and-say问题:
look-and-say序列以1开始。当前数字由前面数字决定。
前8个数字是{1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211}。
1:1
1个1:11
2个1:21
1个2和1个1:1211
1个1和一个2和2个1:111221
3个1和2个2和1个1:312211
1个3和1个1和2个2和2个1:13112221
1个1和1个3和2个1和3个2和1个1:1113213211
给定一个整数n,返回第n个look-and-say序列。
提示:我们需要返回一个字符串的结果。
9. 罗马数字转化为十进制数:
罗马数字用I, V, X, L, C, D, M等符号来表示正整数。每个符号表示一个值,I表示1,V表示5,X表示10,L表示50,C表示100,D表示500,M表示1000。
给定一个字符串s代表一个有效的罗马数字,返回相应的整数。
提示:先假设没有异常情况去解决这个问题。
10. 计算所有有效的IP地址:
给定一个十进制数字字符串,在其中添加句号来构成有效的IP地址。可能会有多余一个有效的IP地址,打印出所有的可能性。
提示:运用嵌套的循环。
11. 正弦的形式写一个字符串:
"Hello World"写成正弦的形式如下:
定义s的snakestring为正弦形式中从左到右,从上到下的顺序出现的字符序列,即为"e lHloWrdlo!"。
给定一个字符串s,返回s的snakestring。
提示,尝试具体的例子,寻找周期。
12. 实现run-length encoding(RLE):
举例:"aaaabcccaa"的RLE为"4a1b3c2a"(4个a, 1个b, 3个c, 2个a),"3e4f2e"的解码为"eeeffffee"。
实现run-length的编码解码函数。
提示:这与二进制数与字符串表示之间的转换很相似。
13. 找到一个子字符串的第一次出现:
给定两个字符串s(search string)和t(text),找到s在t中的第一次出现。
提示:从字符串构成一个签名。