[精选代码笔记]Anagram, group-anagrams, two sum

Valid anagram

242. 有效的字母异位词
题目链接:https://leetcode-cn.com/problems/valid-anagram/
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
Python
# 思路:手动模拟hashtable,将字符串”a-z“的ASCII码作key,计数求差异    
   def  isAnagram(self, s: str, t: str) -> bool:
        arr1, arr2 = [0]*26, [0]*26
        for i in s:
            arr1[ord(i) - ord('a')] += 1
        for i in t:
            arr2[ord(i) - ord('a')] += 1
        return arr1 == arr2
# 思路:map计数,对比计数差异
    def isAnagram(self, s: str, t: str) -> bool:
        dict1, dict2 = {}, {}
        for item in s:
            dict1[item] = dict1.get(item,0) + 1
        for item in t:
            dict2[item] = dict2.get(item,0) + 1
        return dict1 == dict2
# 思路:数组排序后比较差异
    def isAnagram(self, s: str, t: str) -> bool:
        return sorted(s) == sorted(t)
Java
public class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()) return false;
        int [] a = new int [26];
        for(Character c : s.toCharArray()) a[c - 'a']++;
        for(Character c : t.toCharArray()) {
            if(a[c -'a'] == 0) return false;
            a[c - 'a']--;
        }
        return true;
    }
}
public boolean isAnagram(String s1, String s2) {
    int[] freq = new int[256];
    for(int i = 0; i < s1.length(); i++) freq[s1.charAt(i)]++;
    for(int i = 0; i < s2.length(); i++) if(--freq[s2.charAt(i)] < 0) return false;
    return s1.length() == s2.length();
}
public boolean isAnagram(String s, String t) 
{
    char[] sChar = s.toCharArray();
    char[] tChar = t.toCharArray();
    Arrays.sort(sChar);
    Arrays.sort(tChar);
    return Arrays.equals(sChar, tChar);   
}

Group Anagrams:

49. 字母异位词分组
题目链接:https://leetcode-cn.com/problems/group-anagrams/
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
说明:

所有输入均为小写字母。
不考虑答案输出的顺序。
Python
def groupAnagrams(self, strs):
    d = {}
    for w in sorted(strs):
        key = tuple(sorted(w))
        d[key] = d.get(key, []) + [w]
    return d.values()
def groupAnagrams(self, strs):
    dic = {}
    for item in sorted(strs):
        sortedItem = ''.join(sorted(item))
        dic[sortedItem] = dic.get(sortedItem, []) + [item]
    return dic.values()
Java
public List<List<String>> groupAnagrams(String[] strs) {
	List<List<String>> res = new ArrayList<>();
    HashMap<String, List<String>> map = new HashMap<>();
    
    Arrays.sort(strs);
    for (int i = 0; i < strs.length; i++) {
    	String temp = strs[i];
    	char[] ch = temp.toCharArray();
    	Arrays.sort(ch);
    	if (map.containsKey(String.valueOf(ch))) {
    		map.get(String.valueOf(ch)).add(strs[i]);
    	} else {
    		List<String> each = new ArrayList<>();
    		each.add(strs[i]);
    		map.put(String.valueOf(ch), each);
    	}
    }
    for (List<String> item: map.values()) {
    	res.add(item);
    }
    return res;
}

Two sum

1. 两数之和
题目链接:https://leetcode-cn.com/problems/two-sum/description/
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
Python
    def twoSum(self, nums, target):
        d = dict()
        for index,num in enumerate(nums):
            if d.get(num) == None:
                d[target - num] = index
            else:
                return [d.get(num), index]
Java
public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> tracker = 
            new HashMap<Integer, Integer>();
        int len = nums.length;
        for (int i = 0; i < len; i++){
            if (tracker.containsKey(nums[i])){
                int left = tracker.get(nums[i]);
                return new int[]{left+1, i+1};
            } else {
                tracker.put(target - nums[i], i);
            }
        }
        return new int[2];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值