最近工作上接到一個需求 假設 客戶給了一個字串 xiangubao 這是拼音,到底是鮮菇包(xian gu bao),還是西安古堡(xi an gi bqo),因為有時候對方忘記切換輸入法,導致中間連續打拼音,但是我們要試圖知道他在說啥。

首先,這問題有考慮到聲母韻母的問題,所以網路上我找到了拼音的所有列舉 ,感謝網路上面的前輩無私的奉獻
https://blog.csdn.net/pigkeli/article/details/10827825
列舉的 Code
PinYinTable = new HashSet();
PinYinTable.Clear();
PinYinTable.Add("a");
PinYinTable.Add("ai");
PinYinTable.Add("an");
PinYinTable.Add("ang");
PinYinTable.Add("ao");
PinYinTable.Add("ba");
PinYinTable.Add("bai");
PinYinTable.Add("ban");
PinYinTable.Add("bang");
PinYinTable.Add("bao");
PinYinTable.Add("bei");
PinYinTable.Add("ben");
PinYinTable.Add("beng");
PinYinTable.Add("bi");
PinYinTable.Add("bian");
PinYinTable.Add("biao");
PinYinTable.Add("bie");
PinYinTable.Add("bin");
PinYinTable.Add("bing");
PinYinTable.Add("bo");
PinYinTable.Add("bu");
PinYinTable.Add("ca");
PinYinTable.Add("cai");
PinYinTable.Add("can");
PinYinTable.Add("cang");
PinYinTable.Add("cao");
PinYinTable.Add("ce");
PinYinTable.Add("ceng");
PinYinTable.Add("cha");
PinYinTable.Add("chai");
PinYinTable.Add("chan");
PinYinTable.Add("chang");
PinYinTable.Add("chao");
PinYinTable.Add("che");
PinYinTable.Add("chen");
PinYinTable.Add("cheng");
PinYinTable.Add("chi");
PinYinTable.Add("chong");
PinYinTable.Add("chou");
PinYinTable.Add("chu");
PinYinTable.Add("chuai");
PinYinTable.Add("chuan");
PinYinTable.Add("chuang");
PinYinTable.Add("chui");
PinYinTable.Add("chun");
PinYinTable.Add("chuo");
PinYinTable.Add("ci");
PinYinTable.Add("cong");
PinYinTable.Add("cou");
PinYinTable.Add("cu");
PinYinTable.Add("cuan");
PinYinTable.Add("cui");
PinYinTable.Add("cun");
PinYinTable.Add("cuo");
PinYinTable.Add("da");
PinYinTable.Add("dai");
PinYinTable.Add("dan");
PinYinTable.Add("dang");
PinYinTable.Add("dao");
PinYinTable.Add("de");
PinYinTable.Add("deng");
PinYinTable.Add("di");
PinYinTable.Add("dian");
PinYinTable.Add("diao");
PinYinTable.Add("die");
PinYinTable.Add("ding");
PinYinTable.Add("diu");
PinYinTable.Add("dong");
PinYinTable.Add("dou");
PinYinTable.Add("du");
PinYinTable.Add("duan");
PinYinTable.Add("dui");
PinYinTable.Add("dun");
PinYinTable.Add("duo");
PinYinTable.Add("e");
PinYinTable.Add("en");
PinYinTable.Add("er");
PinYinTable.Add("fa");
PinYinTable.Add("fan");
PinYinTable.Add("fang");
PinYinTable.Add("fei");
PinYinTable.Add("fen");
PinYinTable.Add("feng");
PinYinTable.Add("fo");
PinYinTable.Add("fou");
PinYinTable.Add("fu");
PinYinTable.Add("ga");
PinYinTable.Add("gai");
PinYinTable.Add("gan");
PinYinTable.Add("gang");
PinYinTable.Add("gao");
PinYinTable.Add("ge");
PinYinTable.Add("gei");
PinYinTable.Add("gen");
PinYinTable.Add("geng");
PinYinTable.Add("gong");
PinYinTable.Add("gou");
PinYinTable.Add("gu");
PinYinTable.Add("gua");
PinYinTable.Add("guai");
PinYinTable.Add("guan");
PinYinTable.Add("guang");
PinYinTable.Add("gui");
PinYinTable.Add("gun");
PinYinTable.Add("guo");
PinYinTable.Add("ha");
PinYinTable.Add("hai");
PinYinTable.Add("han");
PinYinTable.Add("hang");
PinYinTable.Add("hao");
PinYinTable.Add("he");
PinYinTable.Add("hei");
PinYinTable.Add("hen");
PinYinTable.Add("heng");
PinYinTable.Add("hong");
PinYinTable.Add("hou");
PinYinTable.Add("hu");
PinYinTable.Add("hua");
PinYinTable.Add("huai");
PinYinTable.Add("huan");
PinYinTable.Add("huang");
PinYinTable.Add("hui");
PinYinTable.Add("hun");
PinYinTable.Add("huo");
PinYinTable.Add("ji");
PinYinTable.Add("jia");
PinYinTable.Add("jian");
PinYinTable.Add("jiang");
PinYinTable.Add("jiao");
PinYinTable.Add("jie");
PinYinTable.Add("jin");
PinYinTable.Add("jing");
PinYinTable.Add("jiong");
PinYinTable.Add("jiu");
PinYinTable.Add("ju");
PinYinTable.Add("juan");
PinYinTable.Add("jue");
PinYinTable.Add("jun");
PinYinTable.Add("ka");
PinYinTable.Add("kai");
PinYinTable.Add("kan");
PinYinTable.Add("kang");
PinYinTable.Add("kao");
PinYinTable.Add("ke");
PinYinTable.Add("ken");
PinYinTable.Add("keng");
PinYinTable.Add("kong");
PinYinTable.Add("kou");
PinYinTable.Add("ku");
PinYinTable.Add("kua");
PinYinTable.Add("kuai");
PinYinTable.Add("kuan");
PinYinTable.Add("kuang");
PinYinTable.Add("kui");
PinYinTable.Add("kun");
PinYinTable.Add("kuo");
PinYinTable.Add("la");
PinYinTable.Add("lai");
PinYinTable.Add("lan");
PinYinTable.Add("lang");
PinYinTable.Add("lao");
PinYinTable.Add("le");
PinYinTable.Add("lei");
PinYinTable.Add("leng");
PinYinTable.Add("li");
PinYinTable.Add("lia");
PinYinTable.Add("lian");
PinYinTable.Add("liang");
PinYinTable.Add("liao");
PinYinTable.Add("lie");
PinYinTable.Add("lin");
PinYinTable.Add("ling");
PinYinTable.Add("liu");
PinYinTable.Add("long");
PinYinTable.Add("lou");
PinYinTable.Add("lu");
PinYinTable.Add("lv");
PinYinTable.Add("luan");
PinYinTable.Add("lue");
PinYinTable.Add("lun");
PinYinTable.Add("luo");
PinYinTable.Add("ma");
PinYinTable.Add("mai");
PinYinTable.Add("man");
PinYinTable.Add("mang");
PinYinTable.Add("mao");
PinYinTable.Add("me");
PinYinTable.Add("mei");
PinYinTable.Add("men");
PinYinTable.Add("meng");
PinYinTable.Add("mi");
PinYinTable.Add("mian");
PinYinTable.Add("miao");
PinYinTable.Add("mie");
PinYinTable.Add("min");
PinYinTable.Add("ming");
PinYinTable.Add("miu");
PinYinTable.Add("mo");
PinYinTable.Add("mou");
PinYinTable.Add("mu");
PinYinTable.Add("na");
PinYinTable.Add("nai");
PinYinTable.Add("nan");
PinYinTable.Add("nang");
PinYinTable.Add("nao");
PinYinTable.Add("ne");
PinYinTable.Add("nei");
PinYinTable.Add("nen");
PinYinTable.Add("neng");
PinYinTable.Add("ni");
PinYinTable.Add("nian");
PinYinTable.Add("niang");
PinYinTable.Add("niao");
PinYinTable.Add("nie");
PinYinTable.Add("nin");
PinYinTable.Add("ning");
PinYinTable.Add("niu");
PinYinTable.Add("nong");
PinYinTable.Add("nu");
PinYinTable.Add("nv");
PinYinTable.Add("nuan");
PinYinTable.Add("nue");
PinYinTable.Add("nuo");
PinYinTable.Add("o");
PinYinTable.Add("ou");
PinYinTable.Add("pa");
PinYinTable.Add("pai");
PinYinTable.Add("pan");
PinYinTable.Add("pang");
PinYinTable.Add("pao");
PinYinTable.Add("pei");
PinYinTable.Add("pen");
PinYinTable.Add("peng");
PinYinTable.Add("pi");
PinYinTable.Add("pian");
PinYinTable.Add("piao");
PinYinTable.Add("pie");
PinYinTable.Add("pin");
PinYinTable.Add("ping");
PinYinTable.Add("po");
PinYinTable.Add("pu");
PinYinTable.Add("qi");
PinYinTable.Add("qia");
PinYinTable.Add("qian");
PinYinTable.Add("qiang");
PinYinTable.Add("qiao");
PinYinTable.Add("qie");
PinYinTable.Add("qin");
PinYinTable.Add("qing");
PinYinTable.Add("qiong");
PinYinTable.Add("qiu");
PinYinTable.Add("qu");
PinYinTable.Add("quan");
PinYinTable.Add("que");
PinYinTable.Add("qun");
PinYinTable.Add("ran");
PinYinTable.Add("rang");
PinYinTable.Add("rao");
PinYinTable.Add("re");
PinYinTable.Add("ren");
PinYinTable.Add("reng");
PinYinTable.Add("ri");
PinYinTable.Add("rong");
PinYinTable.Add("rou");
PinYinTable.Add("ru");
PinYinTable.Add("ruan");
PinYinTable.Add("rui");
PinYinTable.Add("run");
PinYinTable.Add("ruo");
PinYinTable.Add("sa");
PinYinTable.Add("sai");
PinYinTable.Add("san");
PinYinTable.Add("sang");
PinYinTable.Add("sao");
PinYinTable.Add("se");
PinYinTable.Add("sen");
PinYinTable.Add("seng");
PinYinTable.Add("sha");
PinYinTable.Add("shai");
PinYinTable.Add("shan");
PinYinTable.Add("shang");
PinYinTable.Add("shao");
PinYinTable.Add("she");
PinYinTable.Add("shen");
PinYinTable.Add("sheng");
PinYinTable.Add("shi");
PinYinTable.Add("shou");
PinYinTable.Add("shu");
PinYinTable.Add("shua");
PinYinTable.Add("shuai");
PinYinTable.Add("shuan");
PinYinTable.Add("shuang");
PinYinTable.Add("shui");
PinYinTable.Add("shun");
PinYinTable.Add("shuo");
PinYinTable.Add("si");
PinYinTable.Add("song");
PinYinTable.Add("sou");
PinYinTable.Add("su");
PinYinTable.Add("suan");
PinYinTable.Add("sui");
PinYinTable.Add("sun");
PinYinTable.Add("suo");
PinYinTable.Add("ta");
PinYinTable.Add("tai");
PinYinTable.Add("tan");
PinYinTable.Add("tang");
PinYinTable.Add("tao");
PinYinTable.Add("te");
PinYinTable.Add("teng");
PinYinTable.Add("ti");
PinYinTable.Add("tian");
PinYinTable.Add("tiao");
PinYinTable.Add("tie");
PinYinTable.Add("ting");
PinYinTable.Add("tong");
PinYinTable.Add("tou");
PinYinTable.Add("tu");
PinYinTable.Add("tuan");
PinYinTable.Add("tui");
PinYinTable.Add("tun");
PinYinTable.Add("tuo");
PinYinTable.Add("wa");
PinYinTable.Add("wai");
PinYinTable.Add("wan");
PinYinTable.Add("wang");
PinYinTable.Add("wei");
PinYinTable.Add("wen");
PinYinTable.Add("weng");
PinYinTable.Add("wo");
PinYinTable.Add("wu");
PinYinTable.Add("xi");
PinYinTable.Add("xia");
PinYinTable.Add("xian");
PinYinTable.Add("xiang");
PinYinTable.Add("xiao");
PinYinTable.Add("xie");
PinYinTable.Add("xin");
PinYinTable.Add("xing");
PinYinTable.Add("xiong");
PinYinTable.Add("xiu");
PinYinTable.Add("xu");
PinYinTable.Add("xuan");
PinYinTable.Add("xue");
PinYinTable.Add("xun");
PinYinTable.Add("ya");
PinYinTable.Add("yan");
PinYinTable.Add("yang");
PinYinTable.Add("yao");
PinYinTable.Add("ye");
PinYinTable.Add("yi");
PinYinTable.Add("yin");
PinYinTable.Add("ying");
PinYinTable.Add("yo");
PinYinTable.Add("yong");
PinYinTable.Add("you");
PinYinTable.Add("yu");
PinYinTable.Add("yuan");
PinYinTable.Add("yue");
PinYinTable.Add("yun");
PinYinTable.Add("za");
PinYinTable.Add("zai");
PinYinTable.Add("zan");
PinYinTable.Add("zang");
PinYinTable.Add("zao");
PinYinTable.Add("ze");
PinYinTable.Add("zei");
PinYinTable.Add("zen");
PinYinTable.Add("zeng");
PinYinTable.Add("zha");
PinYinTable.Add("zhai");
PinYinTable.Add("zhan");
PinYinTable.Add("zhang");
PinYinTable.Add("zhao");
PinYinTable.Add("zhe");
PinYinTable.Add("zhen");
PinYinTable.Add("zheng");
PinYinTable.Add("zhi");
PinYinTable.Add("zhong");
PinYinTable.Add("zhou");
PinYinTable.Add("zhu");
PinYinTable.Add("zhua");
PinYinTable.Add("zhuai");
PinYinTable.Add("zhuan");
PinYinTable.Add("zhuang");
PinYinTable.Add("zhui");
PinYinTable.Add("zhun");
PinYinTable.Add("zhuo");
PinYinTable.Add("zi");
PinYinTable.Add("zong");
PinYinTable.Add("zou");
PinYinTable.Add("zu");
PinYinTable.Add("zuan");
PinYinTable.Add("zui");
PinYinTable.Add("zun");
PinYinTable.Add("zuo");
PinYinTable.Add("zz");
透過 上面因為有列舉,之後就透過遞迴去把有可能跑完,當然我並沒有特別考慮效能只是想到直覺地把這寫完,如果你覺得我設計的遞迴不好,或是效能不好,可以自行再改寫
var result = new List();
GetPinYin("", "xiangubao", result);
foreach (var res in result) {
Result +=res+"
";
}
public void GetPinYin(string pre, string after,List result)
{
if (string.IsNullOrEmpty(after))
{
result.Add(pre);
return ;
}
var limitLength = 6;
if (after.Length <= 6)
{
limitLength = after.Length;
}
for (var i = 1; i <= limitLength; i++)
{
var shortS = after.Substring(0, i);
if (PinYinTable.Contains(shortS))
{
var pre2 = pre + " " + shortS;
GetPinYin(pre2, after.Substring(i, after.Length - i),result);
}
}
}
結果
原來答案不只有 xian gu bao , xi an gu bao 還有其他的..