1. 程式人生 > 實用技巧 >同源異構詞查詢

同源異構詞查詢

public static void main(String[] args) {
        int ret = commpareStr("abc", "12345cab");
        System.out.println(ret);
    }

    //orgStr源欄位
    public static int commpareStr(String tarskStr, String orgStr) {

        // String tarskStr="acabb";
        char tar[] = tarskStr.toCharArray();
        
int count[] = new int[256]; for (int i = 0; i < tar.length; i++) { count[tar[i]]++; } //count[a]=2 count[c]=1 count[b]=2 //定義一個目標視窗和目標字串一樣大小 以及是否找到了同源異構的flag,flag=0代表找到了,flag=整數則表示多餘字元,為負數,則缺少字元 //什麼叫欠債表呢 //從源來字串裡從頭遍歷,如果一個字串出現在欠債表裡,則欠債表裡的相應字串的個數減一,如果個數小於0,則flag--
//當第一次遍歷完視窗[0...M-1]的大小的資料後,下一個視窗遍歷是[1...M], //這是需要處理邏輯和第一次遍歷視窗的邏輯不一樣 //第二次以及以後視窗向左邊移動的時候,如果進入視窗的字元,如果在欠債表裡已經<=0,那麼flag++,且欠債表裡的相應字串的個數減一 //從左邊出去的視窗資料[R-M] 以及<0,則flag--,則欠債表裡響應字串的個數+1 //進入視窗的字元,在欠債表裡個數-1,出去視窗的字元,在欠債表裡個數+1(ps:還給欠債表) // commpareStr("abc","12345cad"); int
M = tarskStr.length(); char org[] = orgStr.toCharArray(); int R = 0; int flag = 0; for (; R < M; R++) { System.out.println(org[R] + "=" + count[org[R]]); if ((count[org[R]] = count[org[R]] - 1) < 0) {//在-1之前已經是0了,如果再次-1必然是負數,flag+1(我欠表裡字元一個) flag++; } } for (; R < org.length; R++) { if (flag == 0)//直接找到同源異構詞 return R - M; if ((count[org[R]] = count[org[R]] - 1) < 0) { flag++; } if (count[org[R - M]]++ < 0) { flag--; } } return flag == 0 ? R - M : -1; }