有序的组合
接到一个需求:需要支持用户按拼音搜索信息(好友或是其它装扮之类的),首先有一个对应的文字编码库,用来标出哪些汉字是多音字,然后返回该汉字的首字拼音,比如:你好 –> 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匹配即可知道是否满足要求。
网上有一个专门用于解决数学的向量和矩阵的库Sylvester