Samkelo Siyabonga Ngubo Ответов: 2

Как я могу написать функцию, возвращающую все анаграммы данного слова (включая само слово) в любом порядке.


An anagram is a word formed from another by rearranging its letters, using all the original letters exactly once; for example, orchestra can be rearranged into carthorse.

Write a function which returns all anagrams of a given word (including the word itself) in any order.

For example GetAllAnagrams("abba") should return collection containing "aabb", "abab", "abba", "baab", "baba", "bbaa".

using System;

using System.Text;

using System.Collections.Generic;

public class AllAnagrams

{

public static ICollection<string> GetAllAnagrams(string str)
{

throw new NotImplementedException("Waiting to be implemented.");

}

public static void Main(string[] args)

{

ICollection<string> anagrams = GetAllAnagrams("abba"); foreach (string a in anagrams)

Console.WriteLine(a);

}
}


Что я уже пробовал:

using System;
using System.Collections.Generic;

public class AllAnagrams
{
	public static ICollection<string> GetAllAnagrams(string str)
	{
		List<string> _List = new List<string>();
		bool[] noswitch = new bool[str.Length];
		getOptions(str, ref noswitch, ref _List, str.Length);
		ICollection<string> list = _List;
		return list;
	}

	public void getOptions(string word, ref bool[] noswitch, ref List<string> options, int size)
	{
		if (size > 2)
		{
			for (int i = 0; i < noswitch.Length; i++)
			{
				noswitch[i] = true;
				getOptions(word, ref noswitch, size - 1);
				noswitch[i] = false;
			}
		}
		else
		{
			for (int y = 0; y < noswitch.Length; y++)
			{
				int prevCount = -1;
				if (noswitch[y] == false)
				{
					if (prevCount == -1)
					{
						prevCount = y;
					}
					else
					{
						char[] array = word.ToCharArray();
						char charb = word[y];
						array[y] = array[prevCount];
						array[prevCount] = charb;
						string newWord = new string (array);
						if (!options.Contains(newWord))
						{
							options.Add(newWord);
							Console.WriteLine("added");
						}
					}
				}
			}
		}
	}

	public static void Main(string[] args)
	{
		ICollection<string> anagrams = GetAllAnagrams("abba");
		foreach (string a in anagrams)
			Console.WriteLine(a);
	}
}

2 Ответов

Рейтинг:
2

OriginalGriff

Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете! Поэтому начните с Google и найдите алгоритм, а затем подумайте о реализации.

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


Рейтинг:
16

Patrice T

Цитата:
Как я могу написать функцию, возвращающую все анаграммы данного слова (включая само слово) в любом порядке.

Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.

Возьмите лист бумаги и карандаш. Сделайте несколько небольших образцов A, AB, ABC, ABCD ...
Во-первых, не повторяйте Буквы в одном и том же слове.
Подумайте о том, как вы можете механически описать, как вы находите все анаграммы.
Как только у вас есть алгоритм, который работает, уточните, чтобы обрабатывать повторяющиеся буквы.

- Изучите один или несколько методов анализа, У. Е. сверху вниз Djikstra способ это хорошее начало.
https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design[^]
https://en.wikipedia.org/wiki/Structured_programming[^]
https://en.wikipedia.org/wiki/Edsger_W._Dijkstra[^]
https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF[^]

Совет: сортируйте анаграммы в алфавитном порядке,это может помочь вам составить схему.