【数据结构与算法】之字符串系列-20240124

发布时间:2024年01月24日

在这里插入图片描述

一、599. 两个列表的最小索引总和

简单
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。

示例 1:
输入: list1 = [“Shogun”, “Tapioca Express”, “Burger King”, “KFC”],list2 = [“Piatti”, “The Grill at Torrey Pines”, “Hungry Hunter Steakhouse”, “Shogun”]
输出: [“Shogun”]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。

示例 2:
输入:list1 = [“Shogun”, “Tapioca Express”, “Burger King”, “KFC”],list2 = [“KFC”, “Shogun”, “Burger King”]
输出: [“Shogun”]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。

思路:
1、获取两个list的相同元素交集
2、对元素交集构建索引和与元素列表的映射(可能答案不止一个)
3、排序返回索引和最小的元素列表

def func599(list1,list2):
    res=defaultdict(list)
    for char in set(list1) & set(list2):
        res[list1.index(char)+list2.index(char)].append(char)   #defaultdict(<class 'list'>, {3: ['KFC'], 1: ['Shogun'], 4: ['Burger King']})
    return min(res.items())

list1= ["Shogun", "Tapioca Express", "Burger King", "KFC"]
list2 = ["KFC", "Shogun", "Burger King"]
print(func599(list1,list2))

重点

d={1:'a',3:'g',5:'u'}
print(d.items())            # dict_items([(1, 'a'), (3, 'g'), (5, 'u')])
print(max(d.items()))       # (5, 'u')
print(min(d.items()))       # (1, 'a')

二、657. 机器人能否返回原点

简单
在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。
如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。
注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。

示例 1:
输入: moves = “UD”
输出: true
解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。

示例 2:
输入: moves = “LL”
输出: false
解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。

class Solution:
    def func657(self, moves):
        L = -1
        R = 1
        U = 1
        D = -1
        res = 0
        for item in moves:
            if item == 'L':
                res -= 1
            elif item == 'R':
                res += 1
            elif item == 'U':
                res += 1
            else:
                res -= 1
        if res == 0:
            return True
        return False


ss = Solution()
moves = "UD"
print(ss.func657(moves))

三、680. 验证回文串 II

简单
给你一个字符串 s,最多 可以从中删除一个字符。
请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。

示例 1:
输入:s = “aba”
输出:true

示例 2:
输入:s = “abca”
输出:true
解释:你可以删除字符 ‘c’ 。

示例 3:
输入:s = “abc”
输出:false

class Solution680:
    def func1(self, s):
        left = 0
        right = len(s) - 1
        while left < right:
            if s[left] == s[right]:
                left += 1
                right -= 1
            elif s[left] != s[right]:
                return s[left:right] == s[left:right][::-1] or s[left + 1:right + 1] == s[left + 1:right + 1]
        return True


s = Solution680()
strs = "abc"
print(s.func1(strs))

四、796. 旋转字符串

简单

给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = ‘abcde’,在旋转一次之后结果就是’bcdea’ 。

示例 1:
输入: s = “abcde”, goal = “cdeab”
输出: true
示例 2:
输入: s = “abcde”, goal = “abced”
输出: false

思路:如果字符串A经过多次旋转之后得到字符串B,那么字符串A拼接后再去掉首尾各一位后一定包含字符串B

def func796(s, goal):
    return goal in (s + s)[1:-1]

s = "abcde"
goal = "abced"
print(func796(s, goal))

五、771. 宝石与石头

简单
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
字母区分大小写,因此 “a” 和 “A” 是不同类型的石头。
示例 1:
输入:jewels = “aA”, stones = “aAAbbbb”
输出:3

示例 2:
输入:jewels = “z”, stones = “ZZ”
输出:0

def func771(jewels, stones):
    return sum([stones.count(i) for i in jewels])

jewels = "z"
stones = "ZZ"
print(func771(jewels, stones))

在这里插入图片描述

文章来源:https://blog.csdn.net/YZL40514131/article/details/135798681
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。