lintcode入门篇七
211. 字符串置换
给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字符串的置换。
置换的意思是,通过改变顺序可以使得两个字符串相等。
样例
Example 1:
Input: "abcd", "bcad"
Output: True
Example 2:
Input: "aac", "abc"
Output: False
class Solution: """ @param A: a string @param B: a string @return: a boolean """ def Permutation(self, A, B): # write your code here dic_A,dic_B = {},{} for i in A: dic_A[i] = dic_A.get(i,0)+1##每次循环,相同字符的值加1,初始值为0 for j in B: dic_B[j] = dic_B.get(j,0)+1 return dic_A == dic_B
13. 字符串查找
中文English
对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1
。
样例
样例 1:
输入: source = "source" , target = "target"
输出:-1
样例解释: 如果source里没有包含target的内容,返回-1
样例 2:
输入: source = "abcdabcdefg" ,target = "bcd"
输出: 1
样例解释: 如果source里包含target的内容,返回target在source里第一次出现的位置
挑战
O(n2)的算法是可以接受的。如果你能用O(n)的算法做出来那更加好。(提示:KMP)
说明
在面试中我是否需要实现KMP算法?
- 不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。
class Solution: ''' 大致思路: 1.以target长度进行切割,依次循环切割,如果遇到符合条件的话,就直接return。 ''' def strStr(self,source,target): for i in range(len(source)+1):##for i in range(len(source)-len(target)+1)同样可以,因为按len(target)来切割,切到len(source)-len(target)才是完整 if source[i:i+len(target)] == target: return i return -1
213. 字符串压缩
设计一种方法,通过给重复字符计数来进行基本的字符串压缩。
例如,字符串 aabcccccaaa
可压缩为 a2b1c5a3
。而如果压缩后的字符数不小于原始的字符数,则返回原始的字符串。
可以假设字符串仅包括 a-z 的字母。
样例
样例 1:
输入:str = "aabcccccaaa"
输出:"a2b1c5a3"
样例 2:
输入:str = "aabbcc" 输出:"aabbcc"
class Solution: ''' 大致思路: 1.初始化一个p为None,如果下一个值和p不同的话,则开始重置。否则的话开始计数 2.同时的话开始拼接字符串。 ''' def compress(self,originalString): p = '' count = 0 new_str = '' for i in originalString + ' ': ##如果是最后一位的话,那么就是空格,则需要加上最后一个count if i == ' ': new_str = new_str + str(count) elif i != p: p = i new_str = new_str + str(count) + p count = 1 else: count = count + 1 p = i##此p = i可不加,只有出现新的字符的时候,p才更新,此时还是原字符,只是持续计数。 ##做个判断,如果新字符串长度<原字符串长度,则返回新字符串长度,否则的话返回原字符串长度 if len(new_str[1:]) < len(originalString): return new_str[1:] else: return originalString
大致解释:(部分计数+拼接的方式)
1.初始化p为'',count=0,new_str = ''
2.初始字符串加上' ',以便原来最后一个字符加上计数
3.循环字符串,如果是新的字符的话,则count重置为1,p则更新为当前新的字符,同时new_str拼接(new_str = new_str + count + p,不能new_str=new_str+p+count,因为count有初始值0)
4.如果是旧的字符的话,则count持续加1,p不变。如果i为' ',说明是最后一个字符,则加上最后一个字符计数即可。注意if,elif顺序。
5.最后的时候需要做个判断,如果是新字符串小于原字符串的话,则返回新字符串[1:],需要去掉首位0,否则的话需要返回原字符串。