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,否则的话需要返回原字符串。

 

posted @ 2020-03-05 00:17  风不再来  阅读(184)  评论(0编辑  收藏  举报