於Delphi的Case述句中使用字串當作判別變數

DelphiCase述句中使用字串當作判別變數

 

陳佳新╱jarsing@cina.chu.edu.tw

 

● 前言

 

提到Case述句(statement),我們首先會聯想到的應用案例莫過於就是透過一個判別變數,讓程式流程依照不同的條件狀況來選擇符合的路徑繼續執行下去。或者是,當我們的程式中出現了一連串的if else if述句組合時,我們也經常都會想到要利用Case述句來簡化程式碼並藉以提升其可讀性與執行效率。

 

但是在某些情況下,Case述句並無法應用於我們的程式當中,因為其所允許接受的判別變數僅限於任何形式的運算式(expression)與序數型別(ordinal type),這所謂的「序數型別」指的就是整數、字元、列舉、布林和集合等「有次序」的,而且可以應用於諸如Ord()Pred()Succ()Low()High()等函示的型別(請參閱[1])。

 

不幸的是,字串(string)顯然並非序數型別的一種,而在某些時候(底下馬上會舉例),當條件變數的型別是字串而且條件分支又相當多時,儘管無奈,然而除了使用大量的ifelse if述句之外,似乎也別無他法了,唉。

 

例如下面的程式碼在Delphi中便不被允許:

 

     #001 var

     #002      Str: String;  // 宣告String型別的判別變數

     #003     begin

     #004      case Str of  // 錯誤訊息: Ordinal type required

     #005          // ...

     #006      end;

     #007 end;

 

這根本就無法通過編譯嘛,因此傳統的解決方案通常是將之轉換為大量的ifelse if述句的組合體。此時真希望我們用的是Visual Basic,因為下面的程式碼是可被其編譯器允許的(請參閱[5]):

 

     #001 Dim Str As String     ' 宣告String型別的判別變數

     #002     Select Case Str ' 等同於DelphiCase述句

     #003      '...

     #004 End Select        ' OK, 通過編譯

 

於是在本文中,筆者試圖以此問題為出發點,在「除了轉換為ifelse if述句組合的傳統解決方案之外」找尋其他可行的因應之道,並由衷地希望本文對於面臨此問題而亟欲尋求解決方法的人(看了[12]-[14]之後,筆者更發現確實如此)能夠有所幫助。

 

先預告一下好了,筆者打算介紹7種解決方案,其中前5種方法乃是節錄或延伸自[9]-[13]的內容,而第6種則是筆者實作的綜合性多載化(overloading)版本。這些方案分別是:

 

v           方案一:搜尋字串陣列

v           方案二:使用實數索引

v           方案三:利用雜湊函數

v           方案四:巢套case述句

v           方案五:使用TStringList

v           方案六:實作多載函示

v           方案七:應用現成函示

 

本文將從複習條件述句(內容主要參考[1][4])與認識字串(內容主要參考[2])等主題開始,熟悉Delphi者可略過此部分,直接閱讀〈效能議題〉小節直到文末為止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python的一些字符串处理方法来实现找到字符串最长不重复子串的长度。 首先,定义一个字典来记录字符和其在字符串的位置。然后,定义两个变量:max_length用于记录最长不重复子串的长度,start用于记录当前子串的起始位置。 遍历整个字符串,对于每一个字符: 1. 如果字符在字典不存在,或者在当前子串的位置小于start,说明该字符是一个新的不重复字符,可以继续扩展当前子串的长度。 2. 否则,将当前子串的长度与max_length比较,更新max_length为较大的值,并将start更新为当前字符在字典的位置加1,表示以当前字符为起始的新的子串。 最后返回max_length即可。 以下是代码示例: ```python def find_longest_substring_length(s): char_dict = {} # 字典用于记录字符和其在字符串的位置 max_length = 0 # 最长不重复子串的长度 start = 0 # 当前子串的起始位置 for i, char in enumerate(s): if char not in char_dict or char_dict[char] < start: # 如果字符是一个新的不重复字符,更新字典和最长子串长度 char_dict[char] = i else: # 否则,更新max_length为较大的值,并更新start max_length = max(max_length, i - start) start = char_dict[char] + 1 char_dict[char] = i # 检查最后一个子串的长度 max_length = max(max_length, len(s) - start) return max_length s = "pwwkew" length = find_longest_substring_length(s) print(length) ``` 输出结果为3,表示字符串最长不重复子串的长度为3("wke")。 注意:这个方法只能找到最长不重复子串的长度,如果需要得到最长子串本身,需要进行一些额外的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值