public class SUNDAY
{
public SUNDAY()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 实现sunday算法
/// </summary>
/// <param name="str"></param>
/// <param name="Sfind"></param>
/// <returns></returns>
public int findChr(string str,string Sfind)
{
int str_length;//被找字符传长度
int fin_length;//要找字符传长度
int find_count=0;//初始化找到次数
int start = 0; //初始化开始位置
int moveNum = 0; //初始化移动次数
//char[] Sch = str.ToCharArray();
//char[] Fch = Sfind.ToCharArray();
if (str.Length < Sfind.Length)
{
string Stemp = str;
str = Sfind;
Sfind = Stemp;
}
str_length = str.Length;
fin_length = Sfind.Length;
while(start+fin_length<=str_length)
{
moveNum++;
bool isfind = false;//是否在这次移动中找到
string s_temp = str.Substring(start, fin_length);
if (s_temp == Sfind)
{ find_count++; start = start + fin_length; isfind = true; }
if (isfind == false)//如果没找到计算下次移动位置
{
int forwardPos = findPos(str, Sfind, start, fin_length);
start = start + forwardPos;
}
}
return find_count;
}
//找字符在字符串(不算最后一个字符)的位置(倒数)
//没找到返回fin_length,找到返回位置
/// <summary>
/// 找字符在字符串(不算最后一个字符)的位置(倒数);没找到返回fin_length,找到返回位置
/// </summary>
/// <param name="str"></param>
/// <param name="find"></param>
/// <param name="pos"></param>
/// <param name="fin_length"></param>
/// <returns></returns>
public int findPos(string str, string find, int pos, int fin_length)
{
int returnPos = fin_length;
int downPos = 1;
char[] Schr = str.ToCharArray();
char[] Sfin = find.ToCharArray();
char chrFind = Schr[pos + fin_length - 1];//要找的字符
//char chrFind = Schr[pos];//要找的字符
if (fin_length > 1)
{
for (int i = Sfin.GetLength(0) - 2; i >= 0; i--)
{
char Chtemp;
Chtemp = Sfin[i];
if (Chtemp == chrFind)
{
returnPos = downPos;
return returnPos;
}
downPos++;
}
}
return returnPos;
}
/// <summary>
/// 取两个字符串最大公共子串
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
/// <returns></returns>
public string GetLargePublicString(string A, string B)
{
string shortString = A.Length > B.Length ? B : A;//取较短者;
string longString = A.Length > B.Length ? A : B;//取较长者;
for (int i = shortString.Length; i > 0; i--)//长度递减
{
for (int j = 0; j <= shortString.Length - i; j++)//位置递增
{
if (longString.IndexOf(shortString.Substring(j, i)) != -1)
{
return shortString.Substring(j, i);
}
}
}
return "none";
}
/// <summary>
/// 取两个字符串中公共子串数组
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
/// <returns></returns>
public string[] GetLargePublicStringArray(string A, string B)
{
List<string> list_s = new List<string>();
string shortString = A.Length > B.Length ? B : A;//取较短者;
string longString = A.Length > B.Length ? A : B;//取较长者;
for (int i = shortString.Length; i > 0; i--)//长度递减
{
for (int j = 0; j <= shortString.Length - i; j++)//位置递增
{
if (longString.IndexOf(shortString.Substring(j, i)) != -1)
{
if (shortString.Substring(j, i).Length >= 1)
{
list_s.Add(shortString.Substring(j, i));
}
}
}
}
return list_s.ToArray();
}
}