计算数组中不同的旋转字符串个数;旋转字符串定义为str1经右旋转后可以得到str2,str1和str2即为相同的旋转字符串。
eg:picture和turepic即为相同旋转字符串
样例
Given dict = ["picture", "turepic", "icturep", "word", "ordw", "lint"]
return 3
.
分析最基本的思路:
1.循环判断当前字符串和前面的字符串是否为旋转字符串;
2.如果是就删除;
3.返回剩余字符串个数。
代码如下:
public int CountRotateWords(string[] strs)
{
List<string> strList = strs.ToList();
for (int i = 0; i < strList.Count; i++)
{
for (int j = i + 1; j < strList.Count;)
{
if (CountRotateWordsHelper(strList[i], strList[j]))
{
strList.RemoveAt(j); //调用RemoveAt方法后list.Count会减小,为了防止元素遍历时候被漏掉索引不自增
}
else
{
j++; //不是旋转字符串时候索引自增
}
}
}
return strList.Count;
}
下面是判断是否是旋转字符串的方法:
public bool CountRotateWordsHelper(string str1, string str2)
{
if (str1.Length != str2.Length) return false;
str2 += str2; //将str2扩容
if (str2.Contains(str1)) //判断扩容后的str2是否含有str1
return true;
return false;
}
按照自己的思路实现算发只能通过88%的测试数据,显示Memory Limit Exceeded,还是算法的空间复杂度太大造成内存溢出
后来看了官方的思路
如下:
public int CountRotateWords(string[] strs)
{
//官方解法
List<string> strList=new List<string>();
foreach (string item in strs)
{
string s = item + item; //扩容
for (int i = 0; i < item.Length; i++)
{
strList.Remove(s.Substring(i, item.Length)); //除去重复字符串
}
strList.Add(item); //保证去除重复过后必须保留一个
}
return strList.Count;
}
完美解决问题。。。。。代码简单易懂,不得不佩服!!!