Это седьмая статья моих попыток следовать за Стивеном Гридером Курс Udemy на трех разных языках. Решения JavaScript – Стивен Анкет Я стараюсь «перевести» его в Python и Java.
Сегодняшний вопрос:
Проверьте, являются ли две предоставленные строки анаграммы друг друга. Одна строка является анаграммой другой, если она использует одни и те же символы в том же количестве. Рассмотрим только символы, а не пробелы или пунктуацию. Считайте, что заглавные буквы такими же, как и нижний чехол-примеры анаграммы («Безопасность железной дороги», «сказки»)- > Истинные анаграммы (Rail! БЕЗОПАСНОСТЬ!’ , «сказки») -> Истинные Анаграммы («Привет», Пока там ‘) -> ложный
JavaScript:
function anagrams(stringA, stringB) { const charMapA = buildCharMap(stringA); const charMapB = buildCharMap(stringB); if (Object.keys(charMapA).length !== Object.keys(charMapB).length) { return false; } for (let char in charMapA) { if (charMapA[char] !== charMapB[char]) { return false; } } return true; } function buildCharMap(str) { const charMap = {}; for (let char of str.replace(/[^\w]/g, '').toLowerCase()) { charMap[char] = charMap[char] + 1 || 1; } return charMap; }
Python:
import re from collections import Counter def anagrams(string_a: str, string_b: str) -> bool: char_map_a = build_counter(string_a) char_map_b = build_counter(string_b) if len(char_map_a.keys()) != len(char_map_b.keys()): return False for char in char_map_a.keys(): if char not in char_map_b or char_map_a[char] != char_map_b[char]: return False return True def build_counter(string: str) -> Counter: return Counter(re.sub(r'[^\w]', '', string, flags=re.UNICODE).lower())
На самом деле это тоже работает:
import re from collections import Counter def anagrams(string_a: str, string_b: str) -> bool: return build_counter(string_a) == build_counter(string_b) def build_counter(string: str) -> Counter: return Counter(re.sub(r'[^\w]', '', string, flags=re.UNICODE).lower())
Ява:
import java.util.Map; import java.util.stream.Collectors; public static boolean anagrams(String stringA, String stringB) { MapcharMapA = buildCharMap(stringA); Map charMapB = buildCharMap(stringB); if (charMapA.keySet().size() != charMapB.keySet().size()) { return false; } for (char chr : charMapA.keySet()) { if (!charMapB.containsKey(chr) || !charMapA.get(chr).equals(charMapB.get(chr))) { return false; } } return true; } private static Map buildCharMap(String str) { return str.replaceAll("[^\\w]", "") .toLowerCase() .chars() .mapToObj(i -> (char) i) .collect(Collectors.groupingBy(c -> c, Collectors.counting())); }
JavaScript:
function anagrams(stringA, stringB) { return cleanString(stringA) === cleanString(stringB); } function cleanString(str) { return str .replace(/[^\w]/g, '') .toLowerCase() .split('') .sort() .join(''); }
Python:
import re def anagrams(string_a: str, string_b: str) -> bool: return clean_string(string_a) == clean_string(string_b) def clean_string(string: str) -> str: lower = re.sub(r'[^\w]', '', string, flags=re.UNICODE).lower() return ''.join(sorted(lower))
Ява:
import java.util.stream.Collectors; public static boolean anagrams(String stringA, String stringB) { return cleanString(stringA).equals(cleanString(stringB)); } private static String cleanString(String str) { return str.replaceAll("[^\\w]", "") .toLowerCase() .chars() .mapToObj(i -> (char) i) .sorted() .map(String::valueOf) .collect(Collectors.joining()); }
Надеюсь, вам это понравилось. Я бы признателен за любые комментарии и отзывы.
Оригинал: “https://dev.to/tommy3/learning-algorithms-with-js-python-and-java-7-anagrams-1lgf”