📅  最后修改于: 2023-12-03 15:11:15.072000             🧑  作者: Mango
本文介绍一个用于 Anagram 子串搜索或搜索所有排列的 C# 程序,该程序可以在给定一个字符串和一个模式串后,搜索出所有能够通过重新排列字母组成模式串的子串。该程序具有搜索效率高、易于理解、易于修改的特点,适合用于 Anagram 相关问题的解决。
该程序可以完成以下功能:
以下是该程序的核心代码:
public static List<(int start, int end)> FindAnagrams(string s, string p)
{
var result = new List<(int start, int end)>();
var pattern = new int[26];
// 统计模式串字符出现次数
foreach (var ch in p)
{
pattern[ch - 'a']++;
}
int left = 0, right = 0, count = p.Length;
while (right < s.Length)
{
if (pattern[s[right] - 'a'] > 0)
{
count--;
}
pattern[s[right] - 'a']--;
right++;
if (count == 0)
{
result.Add((start: left, end: right - 1));
}
if (right - left == p.Length)
{
if (pattern[s[left] - 'a'] >= 0)
{
count++;
}
pattern[s[left] - 'a']++;
left++;
}
}
return result;
}
该程序的核心是 FindAnagrams
函数,该函数用于搜索所有能够通过重新排列字母组成模式串 p
的子串。该函数包含以下几个步骤:
p
中每个字符出现的次数统计出来,存储到数组 pattern
中。left
和 right
,开始循环遍历字符串 s
,其中 right
先向右移动。s[right]
在 pattern
中出现过,则将 count
减 1。s[right]
,将其在 pattern
中出现的次数减 1。count
减少到 0,说明找到了一个符合条件的子串,将该子串的起始位置和结束位置存储到结果列表中。left
向右移动,同时更新 pattern
数组。如果 s[left]
的计数大于等于 0,说明它是模式串中的一个字符,需要将 count
加一。s
。以下是该程序的使用示例:
string s = "cbaebabacd";
string p = "abc";
var result = FindAnagrams(s, p);
foreach (var item in result)
{
Console.WriteLine($"Start: {item.start}, End: {item.end}");
}
输出结果为:
Start: 0, End: 2
Start: 6, End: 8
说明在字符串 s
中,有两个符合条件的子串,分别为 cba
和 bac
。
本文介绍了一个用于 Anagram 子串搜索或搜索所有排列的 C# 程序,该程序采用了滑动窗口算法,具有搜索效率高、易于理解、易于修改的特点。如果需要解决 Anagram 相关问题,可以使用该程序作为参考实现。