99 lines
2.4 KiB
C#
99 lines
2.4 KiB
C#
using System.Text;
|
|
|
|
namespace DeepAnagramSearch;
|
|
|
|
public class WordSignature : IEquatable<WordSignature>
|
|
{
|
|
public int Length { get; private set; }
|
|
|
|
private readonly int[] counts;
|
|
|
|
private WordSignature()
|
|
{
|
|
counts = new int[26];
|
|
}
|
|
|
|
public int this[char index]
|
|
{
|
|
get
|
|
{
|
|
if (index >= 'a' && index <= 'z') return counts[index - 'a'];
|
|
else if (index >= 'A' && index <= 'Z') return counts[index - 'A'];
|
|
else return -1;
|
|
}
|
|
}
|
|
|
|
public bool Contains(WordSignature inner)
|
|
{
|
|
for (int i = 0; i < counts.Length; i++)
|
|
{
|
|
if (inner.counts[i] > counts[i]) return false;
|
|
}
|
|
return true;
|
|
}
|
|
public bool Equals(WordSignature? other)
|
|
{
|
|
if (other is null) return false;
|
|
for (int i = 0; i < 26; i++)
|
|
{
|
|
if (counts[i] != other.counts[i]) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
StringBuilder result = new();
|
|
for (int i = 0; i < counts.Length; i++)
|
|
{
|
|
if (counts[i] > 0)
|
|
{
|
|
result.Append((char)('a' + i));
|
|
result.Append(counts[i]);
|
|
}
|
|
}
|
|
return result.ToString();
|
|
}
|
|
|
|
public static WordSignature FromPhrase(string phrase)
|
|
{
|
|
WordSignature result = new();
|
|
for (int i = 0; i < phrase.Length; i++)
|
|
{
|
|
char c = phrase[i];
|
|
if (c >= 'a' && c <= 'z')
|
|
{
|
|
result.counts[c - 'a']++;
|
|
result.Length++;
|
|
}
|
|
else if (c >= 'A' && c <= 'Z')
|
|
{
|
|
result.counts[c - 'A']++;
|
|
result.Length++;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static WordSignature operator +(WordSignature a, WordSignature b)
|
|
{
|
|
WordSignature result = new();
|
|
for (int i = 0; i < result.counts.Length; i++)
|
|
{
|
|
result.counts[i] = a.counts[i] + b.counts[i];
|
|
}
|
|
result.Length = a.Length + b.Length;
|
|
return result;
|
|
}
|
|
public static WordSignature operator -(WordSignature a, WordSignature b)
|
|
{
|
|
WordSignature result = new();
|
|
for (int i = 0; i < result.counts.Length; i++)
|
|
{
|
|
result.counts[i] = a.counts[i] - b.counts[i];
|
|
}
|
|
result.Length = a.Length - b.Length;
|
|
return result;
|
|
}
|
|
}
|