class Solution {
public:
/**
* @param str a string
* @return the length of the longest repeating subsequence
*/
int longestRepeatingSubsequence(string& str) {
int len = str.length(), i, j;
int dp[len + 1];
int prev[len + 1];
memset(dp, 0, sizeof(int) * (len + 1) );
memset(prev, 0, sizeof(int) * (len + 1) );
for (i = 1; i <= len; ++i) {
for (j = 1; j <= len; ++j) {
if ((str[i - 1] == str[j - 1]) && (i != j)) {
dp[j] = 1 + prev[j - 1];
} else {
dp[j] = max(dp[j - 1], prev[j]);
}
prev[j - 1] = dp[j - 1];
}
prev[j - 1] = dp[j - 1];
}
return dp[len];
}
};