Word Ladder 未完成

本文探讨了给定两个单词及字典的情况下,寻找从起始单词到目标单词的最短转换序列的问题。通过分析,提出了一种使用广度优先搜索(BFS)的方法来解决此问题,并给出了具体的C++实现代码。

Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformation sequence from beginWord to endWord, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.

Note:

    • Return 0 if there is no such transformation sequence.
    • All words have the same length.
    • All words contain only lowercase alphabetic characters.

每次只能改变一个字符,求最短路径。

开始想法为列出二维矩阵,找出变化一次,变化两次,知道变化为end,从而求最短路径。然而发现需要内存过多,同时超时。

改为采用BFS,这样首先找到的肯定是最短路径。但是同样超时。看到网上都是用java实现的,不知道是什么问题。

 1 class Solution {
 2 private:
 3     int isOneDiff(string beginWord, string endWord)
 4     {
 5         int n=beginWord.size();
 6         int m=endWord.size();
 7         if(n!=m) return -1;
 8         int count=0;
 9         for(int i=0;i<n;i++)
10         {
11             if(beginWord[i]!=endWord[i])
12                 count++;
13             
14         }
15         if(count>1) return -1;
16         return count;
17     }
18 public:
19     int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) {
20         int n=wordDict.size();
21         if(beginWord.empty()||endWord.empty()||n<1||beginWord.size()!=endWord.size()||isOneDiff(beginWord,endWord)==0)
22             return 0;
23         if(isOneDiff(beginWord,endWord)==1)
24             return 2;
25         if((wordDict.find(beginWord)!=wordDict.end())&&(wordDict.find(endWord)!=wordDict.end())&&(n==2))
26             return 0;
27         queue<string> q;
28         map<string,int> wordmap;
29         int wordlength=beginWord.size();
30         int count=1;
31         q.push(beginWord);
32         wordmap.insert(pair<string,int>(beginWord,count));
33         while(!q.empty())
34         {
35             string tmpword=q.front();
36             count=wordmap[tmpword];
37             q.pop();
38             for(int i=0;i<wordlength;i++)
39             {
40                 
41                 for(char j='a';j<='z';j++)
42                 {
43                     if(j==tmpword[i]) continue;
44                     tmpword[i]=j;
45                     if(tmpword==endWord) return count+1;
46                     if(wordDict.find(tmpword)!=wordDict.end()) 
47                     {
48                         q.push(tmpword);
49                         wordmap.insert(pair<string,int>(tmpword,count+1));
50                     }
51                 }
52             }
53         }
54         
55         return 0;
56     }
57 };

 

转载于:https://www.cnblogs.com/zl1991/p/4712174.html

FUNCTION_BLOCK FB_CleaningVerification VAR_INPUT StartVerification: BOOL; // 启动验证 Conductivity: REAL; // 电导率(μS/cm) TOC_Value: REAL; // TOC值(ppb) BioSample_OK: BOOL; // 微生物采样结果(TRUE=合格) END_VAR VAR_OUTPUT VerificationPassed: BOOL; // 验证通过标志 FailCode: WORD; // 失败代码(0x0001=电导率, 0x0002=TOC, 0x0004=微生物) ValidationReport: STRING[200]; // 验证报告 END_VAR VAR CondLimit: REAL := 1.3; // 电导率阈值 TOCLimit: REAL := 500.0; // TOC阈值 Timer: TON := (PT := T#5M); // 验证超时5分钟 END_VAR // 启动验证流程 IF StartVerification THEN Timer(IN := TRUE); // 并行检测三项指标 VerificationPassed := TRUE; FailCode := 0; // 电导率验证 IF Conductivity > CondLimit THEN VerificationPassed := FALSE; FailCode := FailCode OR 16#0001; END_IF; // TOC验证 IF TOC_Value > TOCLimit THEN VerificationPassed := FALSE; FailCode := FailCode OR 16#0002; END_IF; // 微生物验证(需外部采样器反馈) IF NOT BioSample_OK THEN VerificationPassed := FALSE; FailCode := FailCode OR 16#0004; END_IF; // 生成报告 ValidationReport := CONCAT( "验证结果:", BOOL_TO_STRING(VerificationPassed), " | 电导率:", REAL_TO_STRING(Conductivity,1), "/", REAL_TO_STRING(CondLimit,1), " | TOC:", REAL_TO_STRING(TOC_Value,0), "ppb/", REAL_TO_STRING(TOCLimit,0), " | 微生物:", BOOL_TO_STRING(BioSample_OK) ); // 超时处理 IF Timer.Q THEN VerificationPassed := FALSE; FailCode := FailCode OR 16#0008; // 超时错误码 END_IF; ELSE VerificationPassed := FALSE; FailCode := 0; END_IF; END_FUNCTION_BLOCK 根据上述内容改为梯形图
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值