haue_1234,查找两个单词链表共同后缀的起始结点

题目描述

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀空间。设str1和str2分别指向两个单词所在单链表的头结点,请实现一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置的结点,输出该结点对应的字符。

输入

多组数据,每组数据有三行,第一行为链表str1和str2的长度n和m,第二行为链表str1的n个元素,第三行为链表str2的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。

7 5
l o a d i n g
b e i n g
7 9
f l u e n c y
f r e q u e n c y
0 0
输出

对于每组数据输出一行,为共同后缀的起始位置结点对应的字符。

i
u

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef struct LNode
{
    char data;
    struct LNode *next;
}LNode,*LinkNode;
void Initlist(LinkNode &L)//初始化链表
{
    L=new LNode;
    L->next=NULL;
}
void Input(LinkNode &L,int n)//输入数据
{
    LinkNode p,r;
    r=L;
    char num;
    while(n--)
    {
        cin>>num;
        p=new LNode;
        p->data=num;
        r->next=p;
        r=p;
    }
    r->next=NULL;
}
void Createlist(LinkNode &str1,LinkNode &str2,int n,int m)//每次创建两个链表,所以要输入两个链表的数据
{
    Input(str1,n);
    Input(str2,m);
}
void chazhao(LinkNode str1,LinkNode str2,int n,int m)//查找共同后缀的起始点
{
    LinkNode p,q;
    if(n>m)
    {
        p=str1->next;
        q=str2->next;
    }
    else
    {
        p=str2->next;
        q=str1->next;
    }
    /*if和else是使p一直指向最长的链表,只是为了方便遍历,不让自己逻辑混乱*/
    int cha,count=0;
    cha=n-m;
    if(cha<0) cha=-cha;
    while(count<cha)
    {
        p=p->next;
        count++;
    }
    /*使p向后移动n次(n是q指向的链表的长度),因为多余的那几个都是再前面,
    不会影响我们要求的后缀,只有在下面第一个while循环时,让p和q继续遍历的次数相等,才能一一对应*/
    char s;
    int flag;
    LinkNode p1,q1;
    p1=p;
    q1=q;
    /*p1和q1,是为了p->data和q->data出现相等时,继续判断后面的值是否相等*/
    while(p&&q)
    {
        flag=0;
        if(p->data!=q->data)
        {
            p=p->next;
            q=q->next;
            p1=p1->next;
            q1=q1->next;
            continue;
        }
        else
        {
            s=p->data;
            flag=1;//出现相等的点,先让flag=1;
            p=p->next;
            q=q->next;
            while(p1&&q1)
            {
                if(p1->data!=q1->data)
                {
                    flag=0;//后面的值不相等,再让flag=0;
                    break;
                }
                p1=p1->next;
                q1=q1->next;
            }
            if(flag) break;//如果后面的值,全部都相等(flag没有改变),跳出循环
        }
    }
    if(flag)
        cout<<s<<endl;//输出s
}
int main()
{
    int n,m;
    cin>>n>>m;
    while(n!=0&&m!=0)
    {
        LinkNode str1,str2;
        Initlist(str1);
        Initlist(str2);
        Createlist(str1,str2,n,m);
        chazhao(str1,str2,n,m);
        cin>>n>>m;
    }
    return 0;
}

函数查找chazhao部分的解释:

用while循环,遍历p和q,如果对应值不相等,就跳过此次循环,如果相等,定义一个char类型s,用s存储此时相等的值(任意一个即可,这里存的是p->data),让flag=1,再开一个循环,判断后面的值(直到结束)是否相等,如果不相等,让flag=0,break,跳出循环,如果相等,输出刚刚标记的s.

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以为您提供一份 JS 实现的瀑布流代码,具体实现方式如下: 首先,需要在 HTML 页面中添加一个包含列数的 div,如下: ``` <div id="container" style="width:1200px;margin:auto;"> <div class="item"></div> <!-- 需要加入瀑布流的元素 --> <div class="item"></div> <div class="item"></div> ... </div> ``` 接着,在 JS 文件中初始化瀑布流,代码如下: ``` var container = document.getElementById('container'); var items = container.querySelectorAll('.item'); var columnNum = 4; // 设置列数 var columnArr = []; // 用于存放每一列的高度 for (var i = 0; i < columnNum; i++) { columnArr.push(0); } items.forEach(function(item) { // 找到高度最小的一列 var minHeight = Math.min.apply(null, columnArr); var minIndex = columnArr.indexOf(minHeight); // 设置元素样式 item.style.left = minIndex * (item.offsetWidth + 10) + 'px'; // 10 为列间距 item.style.top = minHeight + 'px'; // 更新该列高度 columnArr[minIndex] += item.offsetHeight + 10; // 10 为行间距 }); ``` 这样,就可以实现一个简单的瀑布流效果了。 ### 回答2: 当然可以使用Python来编写程序。Python是一种高级编程语言,具有简单易学、语法清晰、功能强大等特点。 首先,我们需要明确程序的功能和要求。然后,根据需求来设计算法和编写代码。 在Python中,可以使用输入输出函数来获取用户的输入和显示输出。例如,可以使用input()函数来获取用户输入的数据,使用print()函数来显示计算结果。 在程序设计过程中,可以使用各种数据结构和控制结构进行计算和处理。例如,可以使用变量存储数据,使用循环结构实现重复操作,使用条件语句实现根据不同情况进行不同处理等。 此外,Python还提供了许多内置函数和模块,可以帮助我们更便捷地完成任务。例如,可以使用math模块进行数学运算,使用datetime模块处理日期和时间等。 最后,在完成程序编写后,还可以使用各种调试工具和技术来验证程序的正确性和性能。可以使用print语句输出程序中的中间结果,使用断点进行程序调试,使用性能分析工具来优化程序等。 总之,使用Python来编写程序具有许多优势,包括语法简洁易懂、功能丰富、生态圈完善等。无论是初学者还是有经验的开发者,都可以使用Python来实现各种功能强大的程序。 ### 回答3: 当然可以使用Python来编写该程序。Python是一种简单易学的编程语言,非常适合用于编写各类程序。 首先,在开始编写程序之前,需要确保已经安装了Python解释器。然后,可以使用任何文本编辑器打开一个新的Python文件,并开始编写代码。 接下来,需要确定程序的具体要求和功能。根据要求,可以分析出程序需要实现的步骤和逻辑,然后将其转化为代码。 根据代码的逻辑,可以使用Python提供的各种函数和语法结构来实现所需功能。例如,可以使用if语句来进行条件判断,使用循环结构来重复执行某段代码,使用函数来封装重复使用的代码等。 同时,还可以利用Python强大的标准库和第三方库来简化编程过程。Python提供了各类功能强大的库,如NumPy、pandas、matplotlib等,可以用于数学计算、数据处理和可视化等方面。 在编写代码的过程中,可以使用Python的实时运行环境交互式地测试代码。这可以加快程序的开发速度,并且可以立即查看代码的运行结果。 最后,在完成代码编写后,可以保存代码并运行程序。可以通过命令行或者第三方集成开发环境(IDE)来运行Python程序。 总之,使用Python来编写程序非常方便和灵活。通过灵活运用Python提供的语法和库函数,可以实现各类功能强大的程序。同时,Python还拥有庞大的开发者社区,可以获取各类问题的解答和学习资源。无论是初学者还是有经验的开发者,都可以通过Python来实现各种复杂的程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值