可以应用哪些优化来减少查找最小编号的执行时间。将字符串转换为给定字符串的字谜的步骤?
What optimizations could be applied to reduce the execution time of finding min no. of steps to convert a string into an anagram of a given string?
此要求是算法挑战的一部分。详情如下:
使用 Case/Requirement :两个字符串即。 's' & 't' 仅包含小写英文字母且长度相等。字符串't'需要修改为字符串's'的变位词,替换't'中的字符。每一次替换都算作一个步骤。预期输出应该是所需的此类步骤的最少数量。
例子
示例输入:
s = "朋友"
t = "家庭"
预期输出:4
原因:将 'a'、'm'、'l' & 'y' 替换为 'r'、'e'、'n' & 'd' 任意顺序
我的方法
使用的数据结构:已使用散列概念,并采用 HashMap 为给定字符串中的所有字母及其频率创建名册
算法概述:首先为两个字符串创建字母表及其频率的映射。然后计算常见字母的频率与字符串 't' 中缺失的字母出现在字符串 's' 中的频率之间的差异之和。由于总和是所需步数的两倍,因此最终答案除以 2 并作为解决方案返回。
FYR 我的代码 :
package com.task;
import java.util.Map;
import java.util.HashMap;
import java.util.Scanner;
class Solution {
Map<Character, Integer> createFreqMap(String s) {
char[] arr = s.toCharArray();
Map<Character, Integer> m = new HashMap<>();
for(char c : arr) {
m.put(c, m.getOrDefault(c, 0) + 1);
}
return m;
}
int diffMap(Map<Character, Integer> ms, Map<Character, Integer> mt) {
int d = 0;
// traverse first map for diff
for(Character c : ms.keySet()) {
if(mt.containsKey(c)) {
d += (Math.abs(ms.get(c) - mt.get(c)));
}
else d += ms.get(c);
}
// traverse second map for diff
for(Character c : mt.keySet()) {
if(!ms.containsKey(c)) {
d += mt.get(c);
}
}
return d;
}
public int minSteps(String s, String t) {
Map<Character, Integer> sFreqMap = createFreqMap(s);
Map<Character, Integer> tFreqMap = createFreqMap(t);
int d = diffMap(sFreqMap, tFreqMap);
return (d/2);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
String t = scan.nextLine();
Solution obj = new Solution();
System.out.println(obj.minSteps(s, t));
}
}
该代码工作正常并给出了我想要的解决方案,但是与其他参与者相比它很慢,那么如何才能减少执行时间呢?
首先你不需要遍历第二张地图
为了进一步优化这一点,您可以使用数组而不是地图。您只有 26 个可能的键,因此不会有任何内存问题。
public class App {
int[] createFreqMap(String s) {
char[] arr = s.toCharArray();
int[] m = new int[26];
for (char c : arr) {
m[c - 'a']++;
}
return m;
}
int diffMap(int[] ms, int[] mt) {
int d = 0;
for (int i = 0; i < ms.length; i++) {
d += Math.abs(ms[i] - mt[i]);
}
return d/2;
}
public int minSteps(String s, String t) {
int[] sFreqMap = createFreqMap(s);
int[] tFreqMap = createFreqMap(t);
return diffMap(sFreqMap, tFreqMap);
}
public static void main(String[] args) {
String s = "friend";
String t = "family";
App obj = new App();
System.out.println(obj.minSteps(s, t));
}
}
此要求是算法挑战的一部分。详情如下:
使用 Case/Requirement :两个字符串即。 's' & 't' 仅包含小写英文字母且长度相等。字符串't'需要修改为字符串's'的变位词,替换't'中的字符。每一次替换都算作一个步骤。预期输出应该是所需的此类步骤的最少数量。
例子
示例输入:
s = "朋友"
t = "家庭"
预期输出:4
原因:将 'a'、'm'、'l' & 'y' 替换为 'r'、'e'、'n' & 'd' 任意顺序
我的方法
使用的数据结构:已使用散列概念,并采用 HashMap 为给定字符串中的所有字母及其频率创建名册
算法概述:首先为两个字符串创建字母表及其频率的映射。然后计算常见字母的频率与字符串 't' 中缺失的字母出现在字符串 's' 中的频率之间的差异之和。由于总和是所需步数的两倍,因此最终答案除以 2 并作为解决方案返回。
FYR 我的代码 :
package com.task;
import java.util.Map;
import java.util.HashMap;
import java.util.Scanner;
class Solution {
Map<Character, Integer> createFreqMap(String s) {
char[] arr = s.toCharArray();
Map<Character, Integer> m = new HashMap<>();
for(char c : arr) {
m.put(c, m.getOrDefault(c, 0) + 1);
}
return m;
}
int diffMap(Map<Character, Integer> ms, Map<Character, Integer> mt) {
int d = 0;
// traverse first map for diff
for(Character c : ms.keySet()) {
if(mt.containsKey(c)) {
d += (Math.abs(ms.get(c) - mt.get(c)));
}
else d += ms.get(c);
}
// traverse second map for diff
for(Character c : mt.keySet()) {
if(!ms.containsKey(c)) {
d += mt.get(c);
}
}
return d;
}
public int minSteps(String s, String t) {
Map<Character, Integer> sFreqMap = createFreqMap(s);
Map<Character, Integer> tFreqMap = createFreqMap(t);
int d = diffMap(sFreqMap, tFreqMap);
return (d/2);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
String t = scan.nextLine();
Solution obj = new Solution();
System.out.println(obj.minSteps(s, t));
}
}
该代码工作正常并给出了我想要的解决方案,但是与其他参与者相比它很慢,那么如何才能减少执行时间呢?
首先你不需要遍历第二张地图
为了进一步优化这一点,您可以使用数组而不是地图。您只有 26 个可能的键,因此不会有任何内存问题。
public class App {
int[] createFreqMap(String s) {
char[] arr = s.toCharArray();
int[] m = new int[26];
for (char c : arr) {
m[c - 'a']++;
}
return m;
}
int diffMap(int[] ms, int[] mt) {
int d = 0;
for (int i = 0; i < ms.length; i++) {
d += Math.abs(ms[i] - mt[i]);
}
return d/2;
}
public int minSteps(String s, String t) {
int[] sFreqMap = createFreqMap(s);
int[] tFreqMap = createFreqMap(t);
return diffMap(sFreqMap, tFreqMap);
}
public static void main(String[] args) {
String s = "friend";
String t = "family";
App obj = new App();
System.out.println(obj.minSteps(s, t));
}
}