• [lintcode][美国大公司][1.字符串处理]


    两个字符串是变位词

     1 class Solution:
     2     """
     3     @param s: The first string
     4     @param b: The second string
     5     @return true or false
     6     """
     7     def anagram(self, s, t):
     8         if len(s) == len(t):
     9             d = {}
    10             for i in range(len(s)):  # full scan on each str
    11                 if s[i] in d.keys():
    12                     d[s[i]] += 1
    13                 else:
    14                     d[s[i]] = 1
    15             for i in range(len(s)):
    16                 if t[i] in d.keys():
    17                     d[t[i]] -= 1
    18                     if d[t[i]] == 0:
    19                         d.pop(t[i])
    20                 else:
    21                     return False
    22             return not d
    23         return False
    View Code

    比较字符串

     1 class Solution:
     2     """
     3     @param A : A string includes Upper Case letters
     4     @param B : A string includes Upper Case letters
     5     @return :  if string A contains all of the characters in B return True else return False
     6     """
     7     def compareStrings(self, A, B):
     8         if len(A) >= len(B):
     9             d = {}
    10             for a in A:
    11                 if a in d:
    12                     d[a] += 1
    13                 else:
    14                     d[a] = 1
    15             for b in B:
    16                 if b in d:
    17                     d[b] -= 1
    18                     if d[b] == 0:
    19                         d.pop(b)
    20                 else:
    21                     return False
    22             return True
    23         return False
    View Code

    字符串查找

     1 class Solution:
     2     def strStr(self, source, target):
     3         if source != None and target != None:
     4             if source == target: return 0
     5             if not target: return 0
     6             len_s, len_t = len(source), len(target)
     7             if len_s >= len_t:
     8                 for i in xrange(len_s - len_t + 1):
     9                     if source[i] == target[0]:
    10                         for j in xrange(1, len_t):
    11                             if source[i+j] <> target[j]:
    12                                 break
    13                             if j == len_t - 1:
    14                                 return i
    15         return -1
    View Code

    乱序字符串

    First idea is brute force, keep a candidates list to store the tragets strs, then compare one by one (this compare would generate hashmap for both strs then do the compare), see solution been commented and I failed at last case for time limitation. I think over it and realized that I do not need generate mapping each time, similiar thinking like candidates list, we can keep a candidates hash mapping, so only need generate each strs hashing and compare with target mappings.

    The bonus point for Python is tuple can be key as it can be hashed, so I used tuple(list) as key for the hash mapping, and I store the strs into result list while I do the checking, saved some space and traverse time. (compare the two solutions below)

    Let's look back to the difference, it is typical Time or Space solution, apparently TIME goes first.

     1 class Solution:
     2     def anagrams(self, strs):
     3         res = []
     4         if len(strs) >= 2:
     5             res_map = {}
     6             for s in strs:
     7                 count = [0] * 26  # all lower case chars
     8                 if s:
     9                     for c in s:  # count chars
    10                         count[ord(c)-ord('a')] += 1
    11                 tcount = tuple(count)  # tuple list as key (hash as key)
    12                 if tcount in res_map:
    13                     res_map[tuple(count)].append(s)
    14                 else:
    15                     ls = []
    16                     ls.append(s)
    17                     res_map[tuple(count)] = ls
    18             for val in res_map.values():
    19                 if len(val) > 1:  # anagrams
    20                     for s in val:
    21                         res.append(s)
    22         return res
    23 
    24 
    25 # class Solution:
    26 #     # @param strs: A list of strings
    27 #     # @return: A list of strings
    28 #     def anagrams(self, strs):
    29 #         res = []
    30 #         if len(strs) >= 2:
    31 #             cans = []
    32 #             for s in strs:
    33 #                 flag = False
    34 #                 if cans:
    35 #                     for c in cans:
    36 #                         if self.is_anagrams(s, c):
    37 #                             if c not in res: res.append(c)
    38 #                             res.append(s)
    39 #                             flag = True
    40 #                             break
    41 #                     if not flag: 
    42 #                         cans.append(s)
    43 #                 else:
    44 #                     cans.append(s)
    45 #         return res
    46 
    47         
    48 #     def is_anagrams(self, s, t):
    49 #         if len(s) == len(t):
    50 #             d = {}
    51 #             for i in range(len(s)):  # full scan on each str
    52 #                 if s[i] in d.keys():
    53 #                     d[s[i]] += 1
    54 #                 else:
    55 #                     d[s[i]] = 1
    56 #             for i in range(len(s)):
    57 #                 if t[i] in d.keys():
    58 #                     d[t[i]] -= 1
    59 #                     if d[t[i]] == 0:
    60 #                         d.pop(t[i])
    61 #                 else:
    62 #                     return False
    63 #             return not d
    64 #         return False
    View Code
    class Solution:
        def anagrams(self, strs):
            res = []
            if len(strs) >= 2:
                res_map = {}
                for s in strs:
                    count = [0] * 26  # all lower case chars
                    if s:  # avoid ""
                        for c in s:  # count chars
                            count[ord(c)-ord('a')] += 1
                    tcount = tuple(count)  # tuple list as key (hash as key)
                    if tcount in res_map:
                        if not res_map[tcount] in res:
                            res.append(res_map[tcount])
                        res.append(s)
                    else:
                        res_map[tcount] = s
            return res

    最长公共子串

    http://segmentfault.com/a/1190000002641054

  • 相关阅读:
    团队作业9——测试与发布(Beta版本)
    团队作业8 ----第二次项目冲刺(Beta阶段)博客汇总
    【Beta】 第七次Daily Scrum Meeting
    【Beta】 第六次Daily Scrum Meeting
    【Beta】 第五次Daily Scrum Meeting
    【Beta】 第四次Daily Scrum Meeting
    【Beta】 第三次Daily Scrum Meeting
    Flask-论坛开发-5-memcached缓存系统
    Flask-论坛开发-4-知识点补充
    Flask-论坛开发-3-数据库
  • 原文地址:https://www.cnblogs.com/t--c---/p/4781342.html
Copyright © 2020-2023  润新知