題目爲 你有兩個字符串,即pattern和value。 pattern字符串由字母"a"和"b"組成,用於描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),該字符串也匹配像"a"、"ab"和"b"這樣的模式。但需注意"a"和"b"不能同時表示相同的字符串。編寫一個方法判斷value字符串是否匹配pattern字符串。
思路爲 從a的長度從0開始遍歷,從表達式找出a數量,根據a數量、長度,就可以計算b的長度。判斷是否都是相等。代碼如下。
public bool PatternMatching(string pattern, string value)
{
//當表達式與字符串均爲空 返回true
if (string.IsNullOrEmpty(pattern)&& string.IsNullOrEmpty(value))
{
return true;
}
//單一匹配也返回true
else if (string.IsNullOrEmpty(value) && pattern.Length==1)
{
return true;
}
//都爲空返回false
else if (string.IsNullOrEmpty(pattern)|| string.IsNullOrEmpty(value))
{
return false;
}
int a = 0;
int allLength = value.Length;
//計算含有a和b的數量 從a數量爲0開始遍歷 當確定a的對應字符串,也可以根據總長計算b的數量以及B對應字符串
int aCount = pattern.Count(e => e.Equals('a'));
int bCount = pattern.Count(e => e.Equals('b'));
int maxACount = 0;
if (aCount!=0)
{
maxACount = allLength / aCount;
}
for (; a <= maxACount; a++)
{
//爲#代表初次賦值
string aVal = "#";
string bVal = "#";
int b = 0;
if (bCount!=0)
{
b = (allLength - aCount * a) / bCount;
}
string values = value;
string patternFlag = pattern;
while (patternFlag.Length>0)
{
char Begin = patternFlag[0];
patternFlag = patternFlag.Substring(1);
if (Begin=='a')
{
if (aVal == "#")
{
if (values.Length < a)
{
break;
}
aVal = values.Substring(0, a);
values = values.Substring(a);
}
else
{
if (values.Length<a)
{
break;
}
if (aVal!= values.Substring(0, a))
{
break;
}
values = values.Substring(a);
}
}
else
{
if (bVal == "#")
{
if (values.Length < b)
{
break;
}
bVal = values.Substring(0, b);
values = values.Substring(b);
}
else
{
if (values.Length < b)
{
break;
}
if (bVal != values.Substring(0, b))
{
break;
}
values = values.Substring(b);
}
}
if (string.IsNullOrEmpty(values))
{
//全部遍歷完成 都符合 返回true
return true;
}
}
}
return false;
}