python leetcode 205 同构字符串【简单题】

这篇博客探讨了如何利用哈希表解决两种类型的字符串双射问题:一种是检查两个字符串是否具有相同的字符映射关系,另一种是判断一个模式字符串与输入字符串之间的对应关系。通过建立和比较两个哈希表,可以有效地验证这两种情况下的双射关系是否成立。代码实现中展示了两种不同的解题方法,包括自定义实现和官方标准答案。
摘要由CSDN通过智能技术生成

一 读懂题目

二. 分析,推导解法,产生思路。

解题思路:双射;两张哈希表

三 代码实现

    def isIsomorphic1(self, s, t):
        '''
        双射;两张哈希表
        '''
        dic_s = {}
        dic_t = {}
        i = 0
        while i < len(s):
            if s[i] not in dic_s and t[i] not in dic_t : # 两张哈希表各自都是第一次出现
                dic_s[s[i]] = t[i]
                dic_t[t[i]] = s[i]
            elif s[i] in dic_s and t[i] in dic_t :
                if dic_s[s[i]] != t[i] :
                    return False
            else:
                return False
            i += 1
        return True

类型题:290 单词规律

一 读懂题目:

二 思路:同样是双射问题,只是是字母对应字符串

三 代码实现: 

    def wordPattern(self, pattern, s):
        """
        :type pattern: str
        :type s: str
        :rtype: bool
        """
        # 找规律
        dic_p = {}
        dic_s = {}
        i = 0
        j = 0
        s_start = 0
        while i < len(pattern):

            # 找到s中的字符串,再比较。手写空格划分
            while j < len(s) and s[j] != ' ':  # 找到第一个空格
                j += 1
            s_substr = s[s_start:j]         # 根据s_start与其后的第一个空格,获取字符串
            j += 1                          # 调整j与s_start的位置
            s_start = j

            if pattern[i] not in dic_p and s_substr not in dic_s:  # 两张哈希表各自都是第一次出现
                dic_p[pattern[i]] = s_substr
                dic_s[s_substr] = pattern[i]
            elif pattern[i] in dic_p and s_substr in dic_s:  # 只有一种情况才是满足条件的dic_s[s[i]] == t[i]
                if dic_p[pattern[i]] != s_substr:
                    return False
            else:
                return False
            i += 1

        if i == len(pattern) and j != len(s)+1:   # 特殊情况(长度不对应):aaa对应aa aa aa aa
            return False
        return True

    def wordPattern2(self, pattern, s):
        # 官方标准答案
        word2ch = dict()
        ch2word = dict()
        words = s.split()   # 根据空格划分字符串
        if len(pattern) != len(words):  # 长度不对应直接返回false
            return False

        for ch, word in zip(pattern, words):
            if (word in word2ch and word2ch[word] != ch) or (ch in ch2word and ch2word[ch] != word):
                return False
            word2ch[word] = ch
            ch2word[ch] = word

        return True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值