Изменения рейтингов за последние раунды временно удалены. Скоро они будут возвращены. ×

Блог пользователя shubham_kr

Автор shubham_kr, история, 4 года назад, По-английски

// Leetcode question :- https://leetcode.com/problems/number-of-matching-subsequences/ //Below C++ code gives TLE on submission since I have used temporary variables to avoid repetition and for better code quality.
int numMatchingSubseq(string s, vector& words) { int n = s.length(); vector<vector> arr(26); for(int i=0;i<n;i++) { arr[s[i]-'a'].push_back(i); }

int ans=0;

    for(int i=0;i<words.size();i++) {
        string str=words[i];
        int pr=0,j=0;
        for(j=0;j<str.length();j++) {
            vector<int> v = arr[str[j]-'a'];
            auto k = lower_bound(v.begin(),v.end(),pr);
            if(k==v.end()) break;
            pr = *k +1;
        }
        ans += (j==str.length());
    }

    return ans;
}

//Same code as above but the only thing I changed is, removed the temporary variables and it got ACCEPTED. int numMatchingSubseq(string s, vector& words) { int n = s.length(); vector<vector> arr(26); for(int i=0;i<n;i++) { arr[s[i]-'a'].push_back(i); }

int ans=0;

    for(int i=0;i<words.size();i++) {
        // string str=words[i];
        int pr=0,j=0;
        for(j=0;j<words[i].length();j++) {
            // vector<int> v = arr[words[i][j]-'a'];
            auto k = lower_bound(arr[words[i][j]-'a'].begin(),arr[words[i][j]-'a'].end(),pr);
            if(k==arr[words[i][j]-'a'].end()) break;
            pr = *k +1;
        }
        ans += (j==words[i].length());
    }

    return ans;
}

Since the main reason for TLE in the first version of code is the Copying of the data in temporary variables repeatedly. So, can anyone tell me the efficient way to use variables without making copies such as by using reference which is done by Java?

=> Just for reference, Java code using temporary variables got Accepted

public int lower_bound(ArrayList v,int key) { int l=0 , h = v.size()-1; while(l<h) { int mid = (l+h)/2; if(v.get(mid)>=key) h=mid; else l=mid+1; } return h; }

public int numMatchingSubseq(String s, String[] words) {
    int n = s.length();
    ArrayList<Integer> arr[] = new ArrayList[26];
    for(int i=0;i<26;i++) {
        arr[i] = new ArrayList<>();
    }
    for(int i=0;i<n;i++) {
        arr[s.charAt(i)-'a'].add(i);

    }

    int ans=0;

    for(int i=0;i<words.length;i++) {
        String str=words[i];
        int pr=0,j=0;
        for(j=0;j<str.length();j++) {

            ArrayList<Integer> v = arr[str.charAt(j)-'a'];
            if(arr[str.charAt(j)-'a'].size()==0 || v.get(v.size()-1)<pr)  break;
            int k = lower_bound(v,pr);
            pr = v.get(k) +1;
        }
        ans += (j==str.length()?1:0);
    }

    return ans;
}

Полный текст и комментарии »

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится