有序的組合

接到一個需求:需要支持用戶按拼音搜索信息(好友或是其它裝扮之類的),首先有一個對應的文字編碼庫,用來標出哪些漢字是多音字,然後返回該漢字的首字拼音,比如:你好 –> 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章