TRANCE
1 力扣题49:字母异位词分组
1.1 题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
1.2 思路分析
1.2.1 直接判断两个字符串是否为异位词
对所有字符串进行遍历,判断已有集合中是否存在字符串与其构成异位词。判断方法为排序后逐词比较。
1.2.2 哈希
可用哈希提升效率。如以排序后的字符串为键,或者以各个字母出现的次数为键。
1.3 代码实现
1.3.1 直接判断两个字符串是否为异位词
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<>();
for (String str: strs) {
boolean isFind = false;
for (List<String> list: result) {
if (isYiwei(list.get(0),str)) {
list.add(str);
isFind = true;
break;
}
}
if (!isFind) {
List<String> list = new ArrayList<>();
list.add(str);
result.add(list);
}
}
return result;
}
boolean isYiwei(String str1, String str2) {
if (str1.length()!=str2.length())
return false;
int n = str1.length();
int[] arr1 = new int[n];
int[] arr2 = new int[n];
for (int i=0;i<n;i++) {
arr1[i] = str1.charAt(i)-'0';
arr2[i] = str2.charAt(i)-'0';
}
Arrays.sort(arr1);
Arrays.sort(arr2);
boolean result = true;
for (int i=0; i<n; i++) {
if (arr1[i]!=arr2[i]) {
result = false;
break;
}
}
return result;
//还可用排序后的字符串或各个字母出现的次数作为哈希表的键
}
2 力扣题53:最大子数组和
2.1 题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
2.2 思路分析
2.2.1 动态规划
以当前字符作为结尾,状态转移方程为dp[i]=Math.max(dp[i-1]+nums[i],nums[i])
2.2.2 分治
可寻找出一个规律,分类讨论,分left、mid和right,从mid左右扩散、左区间和右区间中找最大值即可
2.3 代码实现
2.3.1 动态规划
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
int result = dp[0];
for (int i=1; i<n; i++) {
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
result = Math.max(result,dp[i]);
}
return result;
}