数组和字符串

【2】数组和字符串

1.数组

  1. 实现一个支持动态扩容的数组

  2. 实现一个大小固定的有序数组,支持动态增删改操作

  3. 实现两个有序数组合并为一个有序数组

学习哈希表思想,并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)

哈希表定义

  • 散列表(Hash table,也叫哈希表),是根据关键码值(Key和value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
  • 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

冲突

对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为冲突(英语:Collision)

class DynamicArray:
    def __init__(self, capacity=10):
        self._capacity = capacity
        self._array = [None] * self._capacity
        self._size = 0
        
    def __len__(self):
        return self._size
    
    def __str__(self):
        '''转化为字符串'''
        return str(self._array)
    
    def __getitem__(self,index):
        return self._array[index]
    
    def __append__(self, item):
        '''增加元素'''
        if self._size == self._capacity:
            self._capacity = 2*self._capacity
        
        self._array[self._size] = item
        self._size += 1
        
    def __print__(self):
        for i in range(self._size):
            print(self._array[i], end=' ')
        

if __name__ == '__main__':
    
    array = DynamicArray()
    print('数组的长度为:{}'.format(array.__len__()))
    print(type(array.__str__()))
    print(type(array._array))
    
    array.__append__(10)
    array.__print__()

2.字符串

2.1实现一个字符集,只包含 a~z 这 26 个英文字母的 Trie 树

####2.1.1概念

  • 字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种

数组和字符串_第1张图片

2.1.2基本性质

  • 根节点不包含字符,除根节点外的每一个子节点都包含一个字符
  • 从根节点到某一节点。路径上经过的字符连接起来,就是该节点对应的字符串
  • 每个节点的所有子节点包含的字符都不相同

2.1.3.应用场景

  • 典型应用是用于统计,排序和保存大量的字符串(不仅限于字符串),经常被搜索引擎系统用于文本词频统计

2.1.4.优点

  • 利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较,查询效率比哈希树高

2.1.5.代码

  • Python 字典(Dictionary) ——setdefault()方法

  • Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

    dict.setdefault(key, default=None)
    
class Trie:
    def __init__(self):
        self.root = {}
        self.end = -1
 
    def insert(self, word):
        '''从根节点遍历单词,char by char,、
        如果不存在则新增最后加上一个单词结束标志'''
        curNode = self.root
        for c in word:
            if not c in curNode:
                curNode[c] = {}
            curNode = curNode[c]
        curNode[self.end] = True
    
    
    def search(self, word):
        '''查找word是否在树中'''
        curNode = self.root
        for c in word:
            if not c in curNode:
                return False
            curNode = curNode[c]
        #找到结尾    
        if not self.end in curNode:
            return False
        return True
 
    def startsWith(self, prefix):
        '''前字符'''
        curNode = self.root
        for c in prefix:
            if not c in curNode:
                return False
            curNode = curNode[c]
        
        return True
 
if __name__ == '__main__':
    trie = Trie()
    trie.insert("something")
    trie.insert("somebody")
    trie.insert("somebody3")
    print(trie.search("key"))
    print(trie.search("somebody3"))
    print(trie.startsWith('some'))

2.2实现朴素的字符串匹配算法

朴素的字符串匹配算法
字符串匹配:
输入:原字符串和子串
输出:子串在原字符串中首次出现的位置
朴素算法(暴力搜索法)——只搜索部分

def naive_match(source, target):
    '''   
    if target in source:
        return True
    else:
        return False
    '''
    m,n = len(source),len(target)
    for i in range(m-n+1):  # range 不包括尾部
        if source[i:i+n] == target:
            return i    
    return False
print(naive_match('abaddfeaefe','add'))

3.对应的 LeetCode 练习题

数组

Three Sum(求三数之和)

英文版:https://leetcode.com/problems/3sum/

中文版:https://leetcode-cn.com/problems/3sum/

Majority Element(求众数)

英文版:https://leetcode.com/problems/majority-element/

中文版:https://leetcode-cn.com/problems/majority-element/

Missing Positive(求缺失的第一个正数)

英文版:https://leetcode.com/problems/first-missing-positive/

中文版:https://leetcode-cn.com/problems/first-missing-positive/

字符串

Reverse String (反转字符串)

英文版:https://leetcode.com/problems/reverse-string/

中文版:https://leetcode-cn.com/problems/reverse-string/

Reverse Words in a String(翻转字符串里的单词)

英文版:https://leetcode.com/problems/reverse-words-in-a-string/

中文版:https://leetcode-cn.com/problems/reverse-words-in-a-string/

String to Integer (atoi)(字符串转换整数 (atoi))

英文版:https://leetcode.com/problems/string-to-integer-atoi/

中文版:https://leetcode-cn.com/problems/string-to-integer-atoi/

你可能感兴趣的:(python算法与数据结构)