Рубрики
Без рубрики

Алгоритмы обучения с JS, Python и Java 7: Анаграммы

Это седьмая статья о моих попытках следовать за курсом Удеми Стивена Гридера в трех разных … Помечено начинающими, JavaScript, Python, Java.

Это седьмая статья моих попыток следовать за Стивеном Гридером Курс 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) {
    Map charMapA = 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”