接到一个需求:需要支持用户按拼音搜索信息(好友或是其它装扮之类的),首先有一个对应的文字编码库,用来标出哪些汉字是多音字,然后返回该汉字的首字拼音,比如:你好 –> nh,但是对于 “阿是啊”-> asa、esa,有两个可表达出这个意思,为什么?因为“阿”是多音字“e”和“a”。(举的示例可能不是很恰当,只是想表达出一个意思,输入asa或是esa都能匹配出“阿是啊”)。
比如现在输入:“阿胶” 阿对应的就是AE,胶对应的是J,实际可参与匹配的项有两个C12 * C11 = 2。
现在弄点复杂的情况,输入的4个字都是多间字,第一个字对应汉字拼音首字母为“AE”、第二个对应“BD”、第三个对应“CFG”、第四个对应“OPQ”,那么输入有序组合的任意字符,比如ABC,就能匹配上面完整的汉字。写了一个简单的递归,实现上述的需求。
package { import flash.display.Sprite; /** * ... * @author Meteoric_cry */ public class CombDemo extends Sprite { private var _arr:Array = [ 'AE', 'BD', 'CFG', "OPQ" ]; public function CombDemo() { inited(); } private function inited():void { for (var i:int = 0, len:int = _arr.length; i < len; i++) { _arr[i] = String(_arr[i]).split(""); } var a:Array = getCombArr(_arr); trace("共有:" + a.length + "种组合"); trace(a.join("\n")); } private function getCombArr(arr:Array):Array { var len:int = arr.length; if (len >= 2) { var len_1:int = arr[0].length; var len_2:int = arr[1].length; var tempArr:Array = new Array(); for (var i:int = 0; i < len_1; i++) { for (var j:int = 0; j < len_2; j++) { tempArr.push(arr[0][i] + arr[1][j]); } } var newArr:Array = new Array(); for (var m:int = 2; m < len; m++) { newArr[m - 1] = arr[m]; } newArr[0] = tempArr; return arguments.callee(newArr); } else { return arr[0]; } } } }
运行的结果:
共有:36种组合
ABCO ABCP ABCQ ABFO ABFP ABFQ ABGO ABGP ABGQ ADCO ADCP ADCQ ADFO ADFP ADFQ ADGO ADGP ADGQ EBCO EBCP EBCQ EBFO EBFP EBFQ EBGO EBGP EBGQ EDCO EDCP EDCQ EDFO EDFP EDFQ EDGO EDGP EDGQ
只需要对输入的字母,与上述的结果进行indexOf匹配即可知道是否满足要求。
网上有一个专门用于解决数学的向量和矩阵的库