我需要编写一个读取键盘流的算法,直到获得正确的密码。
如果密码是ababac, 输入是abababa,它意味着到目前为止它读取ababa并且现在它等待c被解锁,如果f进来而不是c,则它重新启动它的过程。
它很容易在O(n ^ 2)中完成,但是我的老师希望我们在O(n)W.C中完成它,它可以在这种复杂性中完成吗?!
答案 0 :(得分:5)
我认为Knuth-Morris-Pratt algorithm的在线版本可以完成这项工作。但是,您必须存储和计算索引数组(在圆形数组实现的情况下,额外的O(n)内存)。
答案 1 :(得分:1)
您可以为它构建automaton。
对于这种方法 - 你可以使用Aho–Corasick - 为字符串创建数据自动机,然后开始用输入文本输入它,直到你到达它的结尾[不接受]或你达到接受状态在自动机中。
Aho-Corasick在模式[密码]和输入大小方面是线性的,因此您得到O(m+n)
答案 2 :(得分:0)
天真的方法是将输入存储在循环char
缓冲区中,并使用自定义strcmp()
来检查它是否包含密码。该方法在O(n)中。
答案 3 :(得分:0)
这是我最接近线性时间......
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
#include<string.h>
typedef struct node_t {
char c;
struct node_t * next;
struct node_t * prev;
} node;
void pop();
void printIT(node *p);
void fixList();
char addToList(char c);
long silence_keyboard(char pw[] ,int size);
char pw[256];
node *head = NULL;
node *tail = NULL;
int i = 0 , listSize = 0;
void main(void)
{
printf("Set PW:");
scanf("%s",pw);
printf("Enter PW (silence_keyboard is activated):\n");
printf("\npw was entered.",silence_keyboard(pw,strlen(pw)));
}
long silence_keyboard(char pw[] ,int size) {
while (i<size) {
for (; i<size && addToList(getche())==pw[i] ; i++);
if (i<size) fixList();
}
return 0;
}
char addToList(char c) {
node *temp=(node *)malloc(sizeof(node));
if (!temp) exit(1);
temp->c=c;
temp->next=NULL;
temp->prev=tail;
if (!tail) head=temp;
else tail->next=temp;
tail=temp;
listSize++;
return c;
}
void fixList() {
node *p=tail;
int j;
while (1) {
for ( ; i>=0 && pw[i]!=tail->c ; i--) {
pop();
printf("\nso far:");
printIT(head);
printf(" pw:%s\n",pw);
}
for ( p=tail,j=i ; j>=0 && pw[j]==p->c ; j-- , p=p->prev );
if (j<0) break;
else {
pop();
printf("\nso far:");
printIT(head);
printf(" pw:%s\n",pw);
i--;
}
}
i=listSize;
}
void printIT(node *p) {
if (p) {
printf("%c",p->c);
printIT(p->next);
}
else {
printf("\n");
return;
}
}
void pop() {
node *p=head;
if (!head) return;
if (head==tail) tail=NULL;
head=head->next;
free(p);
listSize--;
}
答案 4 :(得分:-5)
password = "ababac"
index = 0
while index < password.length
{
read character into x
if( x == password[index])
index++;
}
cout << "congrads!!! you got the password!!";