通过单字符置换可以将一个单词改为另一个单词
问题:假设存在一个5字母单词的字典。给出一个算法确定单词A是否可以通过一系列的单字符置换转换为单词B,并且如果可以的话,输出相应的单词序列。例如,bleed通过序列bleed、blend、blond、blood转换为blood。
求解思路:
将任意单词抽象为节点,任意两个单词之间可以通过变换一个字母到达的变换可以抽象为图中两个节点是相连通的,而不能仅通过替换一个字母变换就到达终点的两个节点之间是不连通的,问题变为如果任意两个单词之间存在可行解,意味着图中两个单词是连通的。我们发现,寻找两个节点的通路就能找到一种解法。
所以可以查找图中两个节点之间的最短路径,用Floyd算法进行求解,Floyd算法直接给出了所有节点之间的最短路径。若不存在路径的情况,即两个节点之间没有可达的路径,则这两个节点必定存在不同的连通分支中,意味着字典中的词是存在着至少两个连通分支的。
//单词转换
#include <stdio.h>
#include <string.h>
#define LENGTH 6
#define NUM 23
#define MAX 100
typedef struct DataType
{
int MAP[NUM][NUM]; //定义一个二维数组MAP
int a[NUM][NUM];
int path[NUM][NUM];
}SeqList;
char dic[NUM][LENGTH]= {"bland","blank","bleak","bleed","blend","blind","blink","blond",
"blood","bloom","blown","blows","brand","brank","bread","break","bream","breed","brown",
"clank","clink","dread","dream"};
bool edge_test(char source[],char target[]);
int main()
{
SeqList L;
for(int i = 0;i < NUM;i++){
for(int j = 0;j < NUM;j++){
if(true == edge_test(dic[i],dic[j])){
L.MAP[i][j] = 1;
}
else if(i != j){
L.MAP[i][j] = MAX;
}
else
L.MAP[i][j] = 0;
}
}
//Floyd算法求最短路径
int j,k,n = NUM;
for(int i = 0;i < n; i++){
for(int j=0; j<n; j++){
L.a[i][j] = L.MAP[i][j];
if(i != j && L.a[i][j] < MAX){
L.path[i][j] = i;
}
else{
L.path[i][j] = 0;
}
}
}
for(k = 0;k < n;k++){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(L.a[i][k] + L.a[k][j] < L.a[i][j]){
L.a[i][j] = L.a[i][k] + L.a[k][j];
L.path[i][j] = L.path[k][j];
}
}
}
}
char source[NUM],target[NUM];
printf("请输入要被转换的字符:\n");
scanf("%s",source);
printf("请输入转换得到的字符:\n");
scanf("%s",target);
int indexs = -1;
int indext = -1;
for(int i = 0;i < NUM;i++){
if(strcmp(source,dic[i]) == 0){
indext = i;
}
if(strcmp(target,dic[i]) == 0){
indexs = i;
}
}
int x = L.path[indexs][indext];
bool exist = false;
if(indexs == x){
if(true == edge_test(dic[indext],dic[indexs])){
printf("%s->",dic[indext]);
printf("%s\n",dic[indexs]);
}
}
else if(indexs == L.path[indexs][x]){
printf("%s->",dic[indext]);
printf("%s->",dic[x]);
printf("%s\n",dic[indexs]);
}
else{
while(true){
if(indexs != L.path[indexs][x]){
int y = L.path[indexs][x];
if(x == y){
printf("不存在变换系列\n");
exist=false;
break;
}
else{
if(!exist){
printf("%s->",dic[indext]);
printf("%s->",dic[x]);
}
exist = true;
}
x = y;
}
else{
exist = true;
break;
}
if(exist){
printf("%s->",dic[x]);
}
}
if(exist){
printf("%s\n",dic[indexs]);
}
}
return 0;
}
bool edge_test(char source[],char target[])//
{
int tag[LENGTH-1];
for(int i = 0; i < LENGTH-1; i++){
if(source[i] != target[i]){
tag[i] = 1;
}
else{
tag[i] = 0;
}
}
int sum = 0;
for(int i = 0; i < LENGTH-1; i++)
sum += tag[i];
if(sum == 1){
return true;
}
else
return false;
}
测试用例:
通过单字符置换可以将一个单词改为另一个单词相关推荐
- 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...
2019独角兽企业重金招聘Python工程师标准>>> EXAMPLE Input: DAMP, LIKE Output: DAMP -> LAMP -> LIMP -& ...
- 编写一个函数,该函数能判断一个英文句子str(带空格)中是否含有某个单词w,如“How old are you?”含有“old”。在main函数中输入一个英文句子,再输入一个单词,如果英文句子中含有那
题目要求: 编写一个C程序,实现以下功能: 编写一个函数,该函数能判断一个英文句子str(带空格(升级版))中是否含有某个单词w,如"How old are you?"含有&quo ...
- 有道单词导入 大量有道单词 生词本 批量导入 添加 有道单词XML 背单词
本程序 主要功能: 对有道生词实现批量导入功能 生成有道单词XML的功能,实现快速导入 有了本程序后就可以批量添加生词.上千个单词也就几秒的时间 文件下载: https://files.cnblo ...
- lstm预测单词_下一个单词预测完整指南
lstm预测单词 As part of my summer internship with Linagora's R&D team, I was tasked with developing ...
- NLP之Bi-LSTM(在长句中预测下一个单词)
Bi-LSTM 文章目录 Bi-LSTM 1.理论 1.1 基本模型 1.2 Bi-LSTM的特点 2.实验 2.1 实验步骤 2.2 实验模型 1.理论 1.1 基本模型 Bi-LSTM模型分为2个 ...
- [Leetcode]第[58]题[JAVA][最后一个单词的长度][字符串]
[问题描述][简单] [解答思路] 直接定位最后一个单词 先找最后一个单词最后一个字母 再找最后一个单词第一个字母 1. 常规做法 时间复杂度:O(N) 空间复杂度:O(1) class Soluti ...
- 汇编语言 循环嵌套 将datasg段中每个单词改为大写字母 改进版
题目要求 将datasg段中每个单词改为大写字母 思路 注意用al存放ascii即可 大写对应的ascii第五位是0,除了第五位以外不变 and al,11011111b 注意循环嵌套的时候 只有一个 ...
- 【Java 正则表达式】单字符匹配、预定字符、量词、Matcher(贪婪、勉强、独占模式)、捕获组、边界匹配符、String类与正则表达式
正则表达式(Regex Expression) 字符串的合法验证 自己编写验证逻辑 使用正则表达式 单字符匹配 预定义字符 量词(Quantifier) Pattern.Matcher Matcher ...
- 解释一下为什么数据文件最好采用单字符作为字段分隔符
本文出处:http://blog.csdn.net/chaijunkun/article/details/17279565,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议 ...
最新文章
- 大神总结的80个Python练手项目列表
- 云平台架构实践中的微服务分解原则
- macOS 10.13 安装Virtualbox失败
- android androidruntime java,java – Runtime.exec():在Android中重启?
- [转贴]Silverlight Socket 实现收发信息
- jquery基本过滤选择器:first :last :not(.myclass) :even :odd :eq(1) :gt(5) :lt(1) :header :animated :focus
- C++ 偏微分数值计算库_ESYSim仿真器介绍之一 C++库介绍
- 通过简单案例,理解观察者模式
- linux下vmware的安装、物理分区使用及卸载
- Kali渗透-ARP断网攻击与监听
- STM32F103通过M26实现远程在线IAP
- Python二手房价格预测(二)——数据处理及数据可视化
- (Java实习生)每日10道面试题打卡——JavaWeb篇
- android.hardware.Camera 5.1之后操作照相机是不是不能用啦,我用小米手机(基本android 6.0)
- 中国市场 Android App 兼容性报告
- 傅里叶Fourier变换fft-python-scipy-幅值-辐角-相位(二)
- 自动化操作桌面之根据图片移动鼠标
- LTE传输模式(TM1 - TM9)
- educoder头歌Web实训 web课——综合应用案例:动态焦点图页面的制作
- 《精通python设计模式》读书笔记之——结构型设计模式
热门文章
- Html词库搜索,词库网关键词采集
- 数码摄影入门之七 用光的艺术
- 最全Python数据清理终极指南
- 时间序列预测方法总结
- 计算机动画制作第一节教案,付雪_ 第四章动画制作_第一节制作逐帧动画——教案设计(7页)-原创力文档...
- Linux---网络部分
- 微软CEO:还将推出新手机!
- vsco使用教程_修图教程 | VSCO film预设使用教程
- 2017.04.01号最新cpu天梯图 包含7代cpu
- 双目测距python_基于OpenCV3.2+VS2013双目测距