密码阅读

时间:2012-03-27 08:53:19

标签: c algorithm

我需要编写一个读取键盘流的算法,直到获得正确的密码。

如果密码是ababac, 输入是abababa,它意味着到目前为止它读取ababa并且现在它等待c被解锁,如果f进来而不是c,则它重新启动它的过程。

它很容易在O(n ^ 2)中完成,但是我的老师希望我们在O(n)W.C中完成它,它可以在这种复杂性中完成吗?!

5 个答案:

答案 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!!";