acm 洛谷 P1019 单词接龙 【DFS】

本文深入探讨了字符串接龙问题的解决策略,利用深度优先搜索(DFS)算法实现字符串匹配与接龙过程,旨在寻找最长接龙串。文章详细介绍了代码实现细节,包括如何判断两个字符串是否可以接龙,以及在DFS过程中实时更新最长接龙长度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目类型:字符串,子串,DFS
题目来源:https://www.luogu.org/problemnew/show/P1019

思路:DFS部分并不难,主要是判断两个字符串是否可以接龙,从哪里开始接的问题。
另外在DFS的过程中,要实时比较当前接龙的长度与保存的最大长度进行比较,更新

代码:

//
// Created by Leo Lee on 2019/6/14.
//

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int N;
int longest;
string strarr[25];
int recode[25];
int ifBothHave(const string &s1,const string &s2);//判断是否可以接龙
void DFS(string s1,int L);
int main(){
    cin>>N;
    for(int i = 0;i<N+1;i++){
        cin>>strarr[i];
    }
    for(int i = 0;i<N;i++){
        if(strarr[i][0] == strarr[N][0]){
            recode[i]++;
            DFS(strarr[i],strarr[i].size());
            recode[i]--;
        }
    }
    cout<<longest;
    return 0;
}

void DFS(string s1,int L){
    for(int i = 0;i<N;i++){
        if(recode[i]>=2) continue;
        int index = ifBothHave(s1,strarr[i]);
        if(index>0){
            recode[i]++;
            if(L+strarr[i].size()-index > longest){
                longest = L+strarr[i].size()-index;
            }
            DFS(s1+strarr[i].substr(index),L+strarr[i].size()-index);
            recode[i]--;
        }else{
            if(L>longest)
                longest = L;
        }
    }

}
int ifBothHave(const string &s1,const string &s2){//判断是否可以接龙
    int index = -1;
    int its1,its2;
    for(its1 = s1.size()-1,its2 = 1;its1>=0&&its2<=s2.size();its1--,its2++){
        if(s1.substr(its1,s1.size()) == s2.substr(0,its2)){
            index = its2;
            if(its1 == 0 || its2 == s2.size() ) //出现包含
                return -1;
            else
                return index;//立马返回,这样可以保证连接起来长度最长
        }
    }
    return index;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值