Anagramme (Schüttelwörter) gruppieren (Schleifen)
Ein Anagramm ist ein Wort, welches durch Umstellen der Buchstaben ein neues (sinnvolles) Wort ergibt (Permutation). Gegeben ist eine Liste aus Wörtern, welche nach gleichen Anagrammen gruppiert werden soll. Die Reihenfolge der Ergebnisse ist unerheblich. Groß- und Kleinschreibung soll nicht unterschieden werden. Wörter, die einzeln vorkommen – also keinen Wortpartner haben – sollen ebenfalls in die Ergebnisliste aufgenommen werden.
liste = [erst, brei, teer, achse, rest, bier, brie, sachse]
1 Kommentare
5 Lösung(en)
function haveSameLetters(str1, str2) {
str1 = str1.toLowerCase(); str2 = str2.toLowerCase();
for (let i = 0; i < str1.length; i++)
if (str2.indexOf(str1[i]) == -1) return false;
return true;
}
function groupSameLetters(arr) {
let out = [];
while (arr.length > 1) {
let cur = [];
cur.push(arr.shift());
for (let i = 0; i < arr.length; i++)
if (haveSameLetters(cur[0], arr[i])) {
cur.push(arr[i]);
arr.splice(i, 1);
i--;
}
out.push(cur);
}
return out;
}
let l = 'erst brei teer achse rest bier brie sachse'.split(' ');
console.log(groupSameLetters(l));
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
def group_anagrams(l):
from collections import Counter, defaultdict
d = defaultdict(lambda: [])
for word in l:
d[frozenset(Counter(word.lower()).items())].append(word)
return list(d.values())
print(group_anagrams(["erst", "brei", "teer", "achse", "rest", "bier", "brie", "asche"]))
Lösung von: Name nicht veröffentlicht
// C++ 17
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using v_s = std::vector<std::string>;
using vv_s = std::vector<v_s>;
vv_s group_anagrams(const v_s& vec, bool caseSensitive = false) {
vv_s result;
std::unordered_map<std::string, v_s> map;
for (auto i{ 0 }; i < vec.size(); ++i) {
auto tmp{ vec[i] };
if(!caseSensitive) std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
std::sort(tmp.begin(), tmp.end());
map[tmp].push_back(vec[i]);
}
for (const auto& item : map)
result.push_back(item.second);
return result;
}
std::ostream& operator<<(std::ostream& os, const vv_s& ana) {
for (const auto& grp : ana) {
for (const auto& item : grp)
os << item << " ";
os << "\n";
}
return os;
}
int main() {
const v_s ana{ "erst", "Brei", "teer", "achse", "rest", "bier", "brie", "ASCHE" };
std::cout << group_anagrams(ana);
}
Lösung von: Jens Kelm (@JKooP)
// NET 6.x | C# 10.x | VS-2022
static List<List<string>> GroupAnagrams(List<string> lst, bool caseSensitive = false) {
var dic = new Dictionary<string, List<string>>();
for (var i = 0; i < lst.Count; i++) {
var tmp = lst[i];
if (!caseSensitive) tmp = tmp.ToLower();
var str = new string(tmp.OrderBy(x => x).ToArray());
if (dic.ContainsKey(str)) dic[str].Add(lst[i]);
else dic.Add(str, new List<string> { lst[i] });
}
return dic.Select(x => x.Value).ToList();
}
var lst = new List<string> { "erst", "Brei", "teer", "achse", "rest", "bier", "brie", "ASCHE" };
foreach (var item in GroupAnagrams(lst))
Console.WriteLine(string.Join(", ", item));
Lösung von: Jens Kelm (@JKooP)
liste,D=['erst', 'brei', 'teer', 'achse', 'rest', 'bier', 'brie', 'asche'],{}
for a in [y for y in sorted([''.join(sorted(i)) + i for i in liste])]:
D[a[:len(a)//2]]=D[a[:len(a)//2]]+(a[len(a)//2:],) if a[:len(a)//2] in D else (a[len(a)//2:],)
print([list(D[i]) for i in D])
Lösung von: rob ert (tub)
Verifikation/Checksumme:
loesung = [ [teer], [brei, bier, brie], [achse, sachse], [erst, rest] ]
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (1)