ブラッシングの質問の順序といくつかのアイデアは、コード カプリス レコード (Web サイトのアドレス: https://programmercarl.com)から引用しています。
アイデアの一部は Leetcode の公式ソリューションである作者のホームページから来ています: https://leetcode.cn/u/leetcode-solution/
242. 有効なアナグラム
2 つの文字列 s
と が与えられた場合、 それらが のアナグラムであるかどうかを t
判断する関数を作成します 。t
s
注:s
と の各文字の出現数t
が同じ 場合 、s
と は t
互いのアナグラムであると言われます。
例:
输入: s = "anagram", t = "nagaram"
输出: true
import java.util.Scanner;
/**
* @author light
* @Description 有效字母异位词
* @create 2023-08-01 13:52
*/
public class IsAnagramTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String str1=input.next();
String str2=input.next();
boolean res=isAnagram(str1,str2);
System.out.println(res);
}
public static boolean isAnagram(String s, String t) {
if(s.length()!=t.length()){
return false;
}
int[] nums=new int[26];
for (int i = 0; i < s.length(); i++) {
nums[s.charAt(i)-'a']++;
}
for (int i = 0; i < t.length(); i++) {
nums[t.charAt(i)-'a']--;
if(nums[t.charAt(i)-'a']<0){
return false;
}
}
return true;
}
}
49. アナグラムのグループ化
文字列の配列が与えられた場合、 アナグラムを結合してください 。結果のリストは任意の順序で返すことができます。
アナグラムは、 原語のすべての文字を並べ替えることによって得られる新しい単語です。
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
import java.util.*;
/**
* @author light
* @Description 字母异位词分组
*
*
* 方法一:排序
* 由于互为字母异位词的两个字符串包含的字母相同,
* 因此对两个字符串分别进行排序之后得到的字符串一定是相同的,
* 故可以将排序之后的字符串作为哈希表的键。
* @create 2023-08-01 14:37
*/
public class GroupAnagramsTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String[] strs=input.next().split(",");
List<List<String>> res=groupAnagrams(strs);
System.out.println(res);
}
public static List<List<String>> groupAnagrams(String[] strs){
Map<String,List<String>> map=new HashMap<>();
for(String str:strs){
char[] array=str.toCharArray();
Arrays.sort(array);
String key=Arrays.toString(array);
List<String> list=map.getOrDefault(key,new ArrayList<>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
438. 文字列内のすべてのアルファベットの単語を検索する
2 つの文字列 s
と を指定すると、のアナグラム のすべての 部分文字列を p
検索し 、これらの部分文字列の開始インデックスを返します。回答が出力される順序は考慮されません。s
p
アナグラムとは 、同じ文字を並べ替えた文字列(同じ文字列を含む)を指します。
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @author light
* @Description 找到字符串中所有字母异位词
*
* 给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。
* 不考虑答案输出的顺序。
* 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
*
* 滑动窗口解法
* 根据题目要求,我们需要在字符串 s 寻找字符串 p 的异位词。
* 因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中
* 构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;
* 当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。
*
* 作者:力扣官方题解
* 链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/1123971/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
* 来源:力扣(LeetCode)
* @create 2023-08-01 15:01
*/
public class FindAnagramsTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String s=input.next();
String p=input.next();
List<Integer> list=findAnagrams(s,p);
System.out.println(list);
}
public static List<Integer> findAnagrams(String s, String p) {
if(s.length()<p.length()){
return new ArrayList<Integer>();
}
int[] sCount=new int[26];
int[] pCount=new int[26];
List<Integer> list=new ArrayList<>();
for (int i = 0; i <p.length(); i++) {
sCount[s.charAt(i)-'a']++;
pCount[p.charAt(i)-'a']++;
}
if(Arrays.equals(sCount,pCount)){
list.add(0);
}
for (int i = 0; i < s.length() - p.length(); i++) {
//维护滑动窗口
sCount[s.charAt(i)-'a']--;
sCount[s.charAt(i+p.length())-'a']++;
if(Arrays.equals(sCount,pCount)){
list.add(i+1);
}
}
return list;
}
}
349. 2 つの配列の交差
2 つの配列 nums1
と sum を指定するとnums2
、 それらの交差部分を返します 。出力内の各要素は 一意である必要があります 。出力結果の順序は無視できます 。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* @author light
* @Description 两个数组的交集
* @create 2023-08-01 17:34
*/
public class IntersectionTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int[] nums1=new int[n];
int m=input.nextInt();
int[] nums2=new int[m];
for (int i = 0; i < n; i++) {
nums1[i]=input.nextInt();
}
for (int i = 0; i < m; i++) {
nums2[i]=input.nextInt();
}
int[] res=intersection(nums1,nums2);
System.out.println(Arrays.toString(res));
}
public static int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set=new HashSet<>();
Set<Integer> res=new HashSet<>();
for(int num:nums1){
set.add(num);
}
for(int num:nums2){
if(set.contains(num)){
res.add(num);
}
}
int[] arr=new int[res.size()];
int i=0;
for(int num:res){
arr[i++]=num;
}
return arr;
}
}
350. 2 つの配列の交差 II
2 つの整数配列の合計が与えられた場合 nums1
、 nums2
2 つの配列の積部分を配列として返してください。返される結果内の各要素の出現数は、両方の配列内の要素の出現数と一致している必要があります (出現数が一致しない場合は、より小さい値を採用することを検討してください)。出力結果の順序は無視できます。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* @author light
* @Description 两个数组的交集 II
* @create 2023-08-01 18:04
*/
public class IntersectTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int[] nums1=new int[n];
int m=input.nextInt();
int[] nums2=new int[m];
for (int i = 0; i < n; i++) {
nums1[i]=input.nextInt();
}
for (int i = 0; i < m; i++) {
nums2[i]=input.nextInt();
}
int[] res=intersect(nums1,nums2);
System.out.println(Arrays.toString(res));
}
public static int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> map=new HashMap<>();
for(int num:nums1){
map.put(num,map.getOrDefault(num,0)+1);
}
int[] res=new int[nums1.length];
int i=0;
for(int num:nums2){
if(map.containsKey(num)&&map.get(num)>0){
res[i++]=num;
map.put(num,map.get(num)-1);
}
}
return Arrays.copyOfRange(res,0,i);
}
}