interface Tree { index: number; childs: number[]; } let rever: Tree[] = new Array(1500000); let order: Tree[] = new Array(1500000);

class Solution { private reverCnt: number = 0; private orderCnt: number = 0;

private insert(word: string, index: number): void {
    let p1: number = 0;
    let p2: number = 0;
    let ch: number = 0;
    let n: number = word.length;
    for (let i = 0; i < n; ++i) {
        ch = word.charCodeAt(i) - 'a'.charCodeAt(0);
        if (!order[p1].childs[ch]) {
            order[p1].childs[ch] = ++this.orderCnt;
        }
        p1 = order[p1].childs[ch];

        ch = word.charCodeAt(n - 1 - i) - 'a'.charCodeAt(0);
        if (!rever[p2].childs[ch]) {
            rever[p2].childs[ch] = ++this.reverCnt;
        }
        p2 = rever[p2].childs[ch];
    }
    order[p1].index = rever[p2].index = index;
}

private isPalindrome(word: string, i: number, j: number): boolean {
    while (i < j) {
        if (word[i++] !== word[j--]) return false;
    }
    return true;
}

private searchRever(word: string, index: number, ret: number[][]): void {
    let p: number = 0;
    for (let i = 0; i < word.length; ++i) {
        let j: number = word.charCodeAt(i) - 'a'.charCodeAt(0);
        if (rever[p].index && this.isPalindrome(word, i, word.length - 1)) {
            ret.push([index - 1, rever[p].index - 1]);
        }
        if (!rever[p].childs[j]) {
            return;
        }
        p = rever[p].childs[j];
    }
    if (rever[p].index && rever[p].index !== index) {
        ret.push([index - 1, rever[p].index - 1]);
    }
}

private searchOrder(word: string, index: number, ret: number[][]): void {
    let p: number = 0;
    for (let i = word.length - 1; i >= 0; --i) {
        let j: number = word.charCodeAt(i) - 'a'.charCodeAt(0);
        if (order[p].index && this.isPalindrome(word, 0, i)) {
            ret.push([order[p].index - 1, index - 1]);
        }
        if (!order[p].childs[j]) {
            return;
        }
        p = order[p].childs[j];
    }
}

public palindromePairs(words: string[]): number[][] {
    for (let i = 0; i < words.length; ++i) {
        this.insert(words[i], i + 1);
    }
    let ret: number[][] = [];
    for (let i = 0; i < words.length; ++i) {
        this.searchRever(words[i], i + 1, ret);
        this.searchOrder(words[i], i + 1, ret);
    }
    rever = new Array(1500000);
    order = new Array(1500000);
    return ret;
}
struct Tree int index childs26; rever1500000 order1500000;class Solution private int reverCnt = 0 orderCnt = 0;public void insertconst string& word const int& index int p1 = 0 p2 = 0

原文地址: http://www.cveoy.top/t/topic/ikvS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录