我在 CareerCup 上发现了一个类似的面试问题,唯一的区别是它是一个整数数组而不是字符数组。我借用了一个想法并做了一些更改,如果您在阅读此 C++ 代码后有任何问题,请告诉我。
我在这里要做的是:函数中的for
循环main
用于遍历给定数组的所有元素,并找到遇到子数组第一个元素的位置,一旦找到,我调用find_subsequence
递归匹配的函数给定数组的元素到子数组的同时保留元素的顺序。最后,find_subsequence
返回位置并计算子序列的大小。
请原谅我的英语,希望我能解释得更好。
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "set"
using namespace std;
class Solution {
public:
int find_subsequence(vector<int> s, vector<int> c, int arrayStart, int subArrayStart) {
if (arrayStart == s.size() || subArrayStart ==c.size()) return -1;
if (subArrayStart==c.size()-1) return arrayStart;
if (s[arrayStart + 1] == c[subArrayStart + 1])
return find_subsequence(s, c, arrayStart + 1, subArrayStart + 1);
else
return find_subsequence(s, c, arrayStart + 1, subArrayStart);
}
};
int main()
{
vector<int> v = { 1,5,3,5,6,7,8,5,6,8,7,8,0,7 };
vector<int> c = { 5,6,8,7 };
Solution s;
int size = INT_MAX;
int j = -1;
for (int i = 0; i <v.size(); i++) {
if(v[i]==c[0]){
int x = s.find_subsequence(v, c, i-1, -1);
if (x > -1) {
if (x - i + 1 < size) {
size = x - i + 1;
j = i;
}
if (size == c.size())
break;
}
}
}
cout << size <<" "<<j;
return 0;
}