459. 重复的子字符串给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba" 输出: False 示例 3: 输入: "abcabcabcabc" 输出: True 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) 思路移动匹配当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的:也就是由前后相同的子串组成。那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图:当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。以上证明的充分性,接下来证明必要性:如果有一个字符串s,在 s + s 拼接后, 不算首尾
349. 两个数组的交集给定两个数组 nums1 和 nums2 ,返回 它们的交集 输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]class Solution(object): def intersection(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """ x=[] if len(nums1)>len(nums2): for i in nums2: if i in nums1: if i not in x: x.append(i) else: for i in nums1:
28. 找出字符串中第一个匹配项的下标实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。思路KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。本篇将以如下顺序来讲解KMP, 什么是KMP KMP有什么用 什么是前缀表 为什么一定要用前缀表 如何计算前缀表 前缀表与next数组 使用next数组来匹配 时间复杂度分析 构造next数组 使用
242. 有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false提示: 1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?class Solution(object): def isAnagram(self, s, t): """ :type s: str :type t: str :rtype: bool """ num={} for i in s: if i in num: num[i]+=1 else: num[i]=1 pr
206. 反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]class Solution: def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: new_head=None old_head=head while old_head: temp=old_head.next old_head.next=new_head new_head=old_head old_head=temp return new_head 思路:首先定义一个 old_head指针,指向头结点,再定义一个 new_head指针,初始化为null。然后就要开始反转了,首先要把 old_head->next 节点用tmp指针保存一下,也就是保存一下这个节点。为什么要保存一下这个节点呢,因为接下来要改变 old_head-&
20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: "()" 输出: true 示例 2: 输入: "()[]{}" 输出: true 示例 3: 输入: "(]" 输出: false 示例 4: 输入: "([)]" 输出: false 示例 5: 输入: "{[]}" 输出: true class Solution: def isValid(self, s: str) -> bool: x=[] for i in s: if i=='(' or i=='[' or i == '{': x.append(i) elif len(x)>0 and ((i==')' and x[-1]=='(')or (i==']'and x[-1]=='[') or (i=='}' and x[-1]=='{')):
一只胖橘