查找字符串公共后缀

该算法类似2012考研计算机第42题

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间...


思路:

得到两个链表长度,将较长者移动diff_len(长度差)个节点,最后同时向后搜索

遇到相同字母则计数,若遇到不相同字母则计数器清零。


#include <string.h>
#include <stdio.h>
typedef struct letter_node{
	char letter;
	struct letter_node *next;
}LETTER_NODE_T;
void init_list(LETTER_NODE_T **p_list,const char *str){
	const char *p = str;
	LETTER_NODE_T * list = NULL,*p_last = NULL;
	LETTER_NODE_T *p_node = NULL;
	if ( NULL == str){
		return;
	}

	while(*p){
		p_node = (LETTER_NODE_T *)malloc(sizeof(LETTER_NODE_T));
		if ( NULL == p_node ){
			printf("malloc error!\n");
			return ;
		}
		p_node->next = NULL;
		p_node->letter = *p;
		if ( NULL == list ){
			list = p_node;
			p_last = list;
		}
		else {
			p_last->next = p_node;
			p_last = p_node;
		}
		p++;
	}
	*p_list = list;
}

void free_list(LETTER_NODE_T *list)
{
	LETTER_NODE_T *p = list,*tmp_p = NULL;
	while(p){
		tmp_p = p;
		p = p->next;
	//	printf("free:%p:%c\n",tmp_p,tmp_p->letter);
		free(tmp_p);
	}
}

void show_list(LETTER_NODE_T *list){
	LETTER_NODE_T *p = list;

	while(p){
		printf("%c",p->letter);
		if (p->next)
		printf("->");
		p = p->next;
	}
	printf("\n");
}

int list_length(LETTER_NODE_T *list){
		LETTER_NODE_T *p = list;
		int length = 0;
		while(p){
		length ++;
		p = p->next;
	}
	return length;
}

void find_common_str(LETTER_NODE_T *list1,LETTER_NODE_T *list2){
	int diff_len = 0; //长度差
	int len_cmp = 0;
	int common_len = 0;
	int len1 = list_length(list1);
	int len2 = list_length(list2);
	int i =0;
	LETTER_NODE_T *p = list1,*common_p1 = NULL;
	LETTER_NODE_T *q = list2,*common_p2 = NULL;
	if (len1 > len2){
		len_cmp = 1;
		diff_len = len1-len2;
		for (i = 0;i < diff_len;i++)
			p= p->next;
	}
	else{
		diff_len = len2 - len1;
		for (i = 0;i < diff_len;i++)
			q = q->next;
	}
	int count = 0;

	while(p && q){
		
		printf("%d  [%5c:%5c]\n",count++,p->letter,q->letter);
		if (p->letter == q->letter){
			printf("letter:%c,common_len:%d\n",p->letter,common_len);
			if (!common_len){
				common_p1 = p;
				common_p2 = q;
			}
			common_len ++;
		}
		else{
			common_len = 0;
		}
		p = p->next;
		q = q->next;
	}
	
	printf("len1 = %d,len2 = %d,diff_len:%d,common_len = %d\n",len1,len2,diff_len,common_len);
	
	for (i = 0;i < common_len;i++){
		printf("commont_letter%d = %c\n",i+1,common_p1->letter);
		common_p1 = common_p1->next;
	}
	
}

int main(int argc,char *argv[])
{
	LETTER_NODE_T * list1 = NULL;	
	LETTER_NODE_T * list2 = NULL;	
	printf("1111\n");
	init_list(&list1,"lgdfgfgoading111111abcdefgccccdefghskdfksfyyyyyyyyyyyyyyccfdkfskdfdxtdfsdxxxxxxxxxyyyyyyyyzzzzzzzzz");
	init_list(&list2,"ppppppppsdfkkjkjk111111111sdfajfjwejifjwebeginga11111111111abcdefgcccccdefgsdfdyyyyyyyyyyyyooppsdfuuufsdxyzxxxxxxxxxxyyyyyyyyzzzzzzzzz");
	show_list(list1);
	show_list(list2);
	find_common_str(list1,list2);
	free_list(list1);
	free_list(list2);
	return 0;
}



运行结果


linux:/myprogram/alg/list # ./find_common_str
1111
l->g->d->f->g->f->g->o->a->d->i->n->g->1->1->1->1->1->1->a->b->c->d->e->f->g->c->c->c->c->d->e->f->g->h->s->k->d->f->k->s->f->y->y->y->y->y->y->y->y->y->y->y->y->y->y->c->c->f->d->k->f->s->k->d->f->d->x->t->d->f->s->d->x->x->x->x->x->x->x->x->x->y->y->y->y->y->y->y->y->z->z->z->z->z->z->z->z->z
p->p->p->p->p->p->p->p->s->d->f->k->k->j->k->j->k->1->1->1->1->1->1->1->1->1->s->d->f->a->j->f->j->w->e->j->i->f->j->w->e->b->e->g->i->n->g->a->1->1->1->1->1->1->1->1->1->1->1->a->b->c->d->e->f->g->c->c->c->c->c->d->e->f->g->s->d->f->d->y->y->y->y->y->y->y->y->y->y->y->y->o->o->p->p->s->d->f->u->u->u->f->s->d->x->y->z->x->x->x->x->x->x->x->x->x->x->y->y->y->y->y->y->y->y->z->z->z->z->z->z->z->z->z
0  [    l:    j]
1  [    g:    i]
2  [    d:    f]
3  [    f:    j]
4  [    g:    w]
5  [    f:    e]
6  [    g:    b]
7  [    o:    e]
8  [    a:    g]
9  [    d:    i]
10  [    i:    n]
11  [    n:    g]
12  [    g:    a]
13  [    1:    1]
letter:1,common_len:0
14  [    1:    1]
letter:1,common_len:1
15  [    1:    1]
letter:1,common_len:2
16  [    1:    1]
letter:1,common_len:3
17  [    1:    1]
letter:1,common_len:4
18  [    1:    1]
letter:1,common_len:5
19  [    a:    1]
20  [    b:    1]
21  [    c:    1]
22  [    d:    1]
23  [    e:    1]
24  [    f:    a]
25  [    g:    b]
26  [    c:    c]
letter:c,common_len:0
27  [    c:    d]
28  [    c:    e]
29  [    c:    f]
30  [    d:    g]
31  [    e:    c]
32  [    f:    c]
33  [    g:    c]
34  [    h:    c]
35  [    s:    c]
36  [    k:    d]
37  [    d:    e]
38  [    f:    f]
letter:f,common_len:0
39  [    k:    g]
40  [    s:    s]
letter:s,common_len:0
41  [    f:    d]
42  [    y:    f]
43  [    y:    d]
44  [    y:    y]
letter:y,common_len:0
45  [    y:    y]
letter:y,common_len:1
46  [    y:    y]
letter:y,common_len:2
47  [    y:    y]
letter:y,common_len:3
48  [    y:    y]
letter:y,common_len:4
49  [    y:    y]
letter:y,common_len:5
50  [    y:    y]
letter:y,common_len:6
51  [    y:    y]
letter:y,common_len:7
52  [    y:    y]
letter:y,common_len:8
53  [    y:    y]
letter:y,common_len:9
54  [    y:    y]
letter:y,common_len:10
55  [    y:    y]
letter:y,common_len:11
56  [    c:    o]
57  [    c:    o]
58  [    f:    p]
59  [    d:    p]
60  [    k:    s]
61  [    f:    d]
62  [    s:    f]
63  [    k:    u]
64  [    d:    u]
65  [    f:    u]
66  [    d:    f]
67  [    x:    s]
68  [    t:    d]
69  [    d:    x]
70  [    f:    y]
71  [    s:    z]
72  [    d:    x]
73  [    x:    x]
letter:x,common_len:0
74  [    x:    x]
letter:x,common_len:1
75  [    x:    x]
letter:x,common_len:2
76  [    x:    x]
letter:x,common_len:3
77  [    x:    x]
letter:x,common_len:4
78  [    x:    x]
letter:x,common_len:5
79  [    x:    x]
letter:x,common_len:6
80  [    x:    x]
letter:x,common_len:7
81  [    x:    x]
letter:x,common_len:8
82  [    y:    y]
letter:y,common_len:9
83  [    y:    y]
letter:y,common_len:10
84  [    y:    y]
letter:y,common_len:11
85  [    y:    y]
letter:y,common_len:12
86  [    y:    y]
letter:y,common_len:13
87  [    y:    y]
letter:y,common_len:14
88  [    y:    y]
letter:y,common_len:15
89  [    y:    y]
letter:y,common_len:16
90  [    z:    z]
letter:z,common_len:17
91  [    z:    z]
letter:z,common_len:18
92  [    z:    z]
letter:z,common_len:19
93  [    z:    z]
letter:z,common_len:20
94  [    z:    z]
letter:z,common_len:21
95  [    z:    z]
letter:z,common_len:22
96  [    z:    z]
letter:z,common_len:23
97  [    z:    z]
letter:z,common_len:24
98  [    z:    z]
letter:z,common_len:25
len1 = 99,len2 = 134,diff_len:35,common_len = 26
commont_letter1 = x
commont_letter2 = x
commont_letter3 = x
commont_letter4 = x
commont_letter5 = x
commont_letter6 = x
commont_letter7 = x
commont_letter8 = x
commont_letter9 = x
commont_letter10 = y
commont_letter11 = y
commont_letter12 = y
commont_letter13 = y
commont_letter14 = y
commont_letter15 = y
commont_letter16 = y
commont_letter17 = y
commont_letter18 = z
commont_letter19 = z
commont_letter20 = z
commont_letter21 = z
commont_letter22 = z
commont_letter23 = z
commont_letter24 = z
commont_letter25 = z
commont_letter26 = z



                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值