求两个字符串的公共后缀

求两个字符串的公共后缀:

例子: zhong #

            zong #

           公共的后缀为:ong

算法的基本思路:

  • 求出str1,str2的长度,len1,len2
  • 设置两个指针p/q分别指向str1 ,str2,如果len1>=len2,指针p指向str1所指的链表第len1-len2+1个位置上的节点;如果len2>len1,指针q指向链表q的第len2-len1+1个位置上的节点。这样就可以将两个链表对齐了
  • 从对齐的位置开始,同时向后移动指针p,q。当出现p->data=q->data,即找到公共位置的起始位置。

 

/********************************************************************
 * @author:zjl
 * @brief: find  the common back
 * @date:29-5-2020
 * ******************************************************************/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Node{
    char data;
    struct Node *next;
}Node,*Linklist;

//head  insert  method
/**
 * @brief createlist
 * @return
 * @attention input your char  and  end by '#'
 */
Linklist createlist(){
    char x;
    Linklist head=(Linklist)malloc(sizeof(Node));
    Linklist list=head;
    list->next=NULL;
    scanf("%c",&x);
    while(x!='#'){
      Linklist pNew=(Linklist)malloc(sizeof(Node));
      pNew->data=x;
      list->next=pNew;
      pNew->next=NULL;
      list=pNew;
      scanf("%c",&x);
    }
    return  head;

}
/**
 * @brief traverseList
 * @param head
 * @return
 */
Linklist traverseList(Linklist head)
{
   Node *p=head;
   printf("common element:");
   while(p!=NULL){
       printf("%c",p->data);
       p=p->next;
   }
   printf("\n");
}
/**
 * @brief linkedLen
 * @param head
 * @return
 */
int linkedLen(Linklist head)
{
   int len=0;
   while(head->next!=NULL)
   {
       len++;
       head=head->next;
   }
   return  len;
}
/**
 * @brief locateTail
 * @param str1
 * @param str2
 * @return
 */
Linklist locateTail(Linklist str1,Linklist str2)
{
    int  len1=linkedLen(str1);
    int  len2=linkedLen(str2);
    Node *p,*q;
    for(p=str1;len1>=len2;len1--){
        p=p->next;
    }
    for(q=str2;len1<len2;len2--){
        q=q->next;
    }
    while(p->next!=NULL&&p->next->data!=q->next->data){
        p=p->next;
        q=q->next;
    }
    return p->next;
}
int main(int argc,char * argv[]){

    Linklist str1,str2;
    str1=createlist();
    str2=createlist();
 //   traverseList(str1->next);
 //   traverseList(str2->next);
    cout<<endl;
    traverseList(locateTail(str1,str2));
    return 0;
}
/********************************************@copyright2020*********end of  file*******************************/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值