LC 1367. Linked List in Binary Tree (KMP)

link

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSubPath(ListNode* head, TreeNode* root) {
        vector<int> arr;
        while(head!=NULL){
            arr.push_back(head->val);
            head=head->next;
        }
        int n=arr.size();
        vector<int> table(n);
        int len=0;
        for(int i=1;i<n;){
            if(arr[i]==arr[len]){
                len++;
                table[i++]=len;
            }else{
                if(len==0){
                    table[i++]=0;
                }else{
                    len=table[len-1];
                }
            }
        }
        return helper(table,root,arr,0);
    }
    
    bool helper(vector<int>& table, TreeNode* root, vector<int>& arr, int idx){
        if(idx==arr.size()) return true;
        if(root==NULL) return false;
        if(root->val==arr[idx]){
            return helper(table,root->left,arr,idx+1) || helper(table,root->right,arr,idx+1);
        }
        while(idx>0){
            idx=table[idx-1];
            if(root->val==arr[idx]){
                return helper(table,root->left,arr,idx+1) || helper(table,root->right,arr,idx+1);
            }
        }
        return helper(table,root->left,arr,0) || helper(table,root->right,arr,0);
    }
};
原文地址:https://www.cnblogs.com/FEIIEF/p/12391635.html