thuật toán của bạn là không chính xác. Điều gì là sai với thuật toán của bạn là một khi nó kiểm tra một nhân vật, nó không quay trở lại nhân vật đó để kiểm tra nó một lần nữa nếu chuỗi con bao gồm ký tự đó không phải là dài nhất. Đầu tiên s
đang được kiểm tra trong chuỗi có độ dài 2 là as
, nhưng khi tìm thấy a
tiếp theo, thì s
bị lãng quên, mặc dù nó có thể làm cho chuỗi con tiếp theo dài hơn. Hãy thử mã này:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
string s = "aaaaaaaaaaaaasadfrhtytbgrbrsvsrhvsg";
vector<bool> v(256,false);
int longStart = 0;
int longEnd = 0;
int start = 0
for (end = 0; end < s.length(); end++)
{
if (!v[s[end]]) // if character not already in the substring
{
v[s[end]] = true;
if (end - start > longEnd - longStart)
{
longEnd = end;
longStart = start;
}
}
else //the character is already in the substring, so increment the
//start of the substring until that character is no longer in it
{
//get to the conflicting character, but don't get to the new character
while ((s[start] != s[end]) && (start < end))
{
start++;
v[s[start]] = false;
}
//remove the conflicting character
start++;
//don't set v[s[start]] to false because that character is still
//encountered, but as the newly appended character, not the first
}
}
longEnd++; //make longEnd the index after the last character for substring purposes
cout << s.substr(longStart, longEnd - longStart) + " " << (longEnd - longStart) << endl;
}
Về cơ bản những gì mã này không là nó giữ một chuỗi con chạy, và bất cứ khi nào nó gặp một nhân vật đã nằm trong chuỗi con, nó increments sự bắt đầu của chuỗi con cho đến khi nhân vật mới không còn trong chuỗi con, sau đó tiếp tục như bình thường. Nó cũng kiểm tra mỗi khi kết thúc được tăng lên nếu chuỗi con đó dài hơn chuỗi con dài nhất được tin trước đó. Đây là O (n) tôi tin như bạn muốn.
Ngoài ra, hãy truyền mã của bạn ra. Mã ngắn gọn có nghĩa là không có gì nếu bạn không thể đọc nó và gỡ lỗi một cách dễ dàng. Ngoài ra, nếu bạn gặp vấn đề với mã của mình, hãy làm việc tất cả bằng tay để hiểu rõ hơn về cách hoạt động của nó và những gì đang xảy ra.
Hy vọng điều này sẽ hữu ích!
Bạn có nghĩa là bạn không thể hoặc không thể hiểu? – Ediac
Bạn có giới hạn độ phức tạp nào không? hoặc bạn chỉ muốn câu trả lời bất kể mất bao lâu để thực hiện. – Rasool
@Ediac bản ngã có vẻ đúng. – adrian008