主頁 >  其他 > 字串

字串

2020-09-23 21:31:13 其他

串的主分支-字串



字串主要用于編程,概念說明、函式解釋、用法詳述見正文,

這里補充一點:字串在存盤上類似字符陣列,所以它每一位的單個元素都是可以提取的,

如s=“abcdefghij”,則s[1]=“b”,s[9]="j",而字串的零位正是它的長度,如s[0]=10,

這可以給我們提供很多方便,如高精度運算時每一位都可以轉化為數字存入陣列


中文名 字串 

外文名 Character string
拼 音 zi fu chuan
簡 稱 串(String)
記 作 s=“a1a2···an”(n>=0)
釋 義 編程語言中表示文本的資料型別


 簡介

字串或串(String)是由數字、字母、下劃線組成的一串字符,一般記為 s=“a1a2···an”(n>=0),它是編程語言中表示文本的資料型別,在程式設計中,字串(string)為符號或數值的一個連續序列,如符號串(一串字符)或二進制數字串(一串二進制數字),
通常以串的整體作為操作物件,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及洗掉一個子串等,兩個字串相等的充要條件是:長度相等,并且各個對應位置上的字符都相等,設p、q是兩個串,求q在p中首次出現的位置的運算叫做模式匹配,串的兩種最基本的存盤方式是順序存盤方式和鏈接存盤方式,

 

設 Σ 是叫做字母表的非空有限集合,Σ 的元素叫做“符號”或“字符”,在 Σ 上的字串(或字)是來自 Σ 的任何有限序列,例如,如果 Σ = {0, 1},則 0101 是在 Σ 之上的字串,
字串的長度是在字串中字符的數目(序列的長度),它可以是任何非負整數,“空串”是在 Σ 上的唯一的長度為 0 的字串,并被指示為 ε 或 λ,
在 Σ 上的所有長度為 n 的字串的集合指示為 Σn,例如,如果 Σ = {0, 1} 則 Σ2 = {00, 01, 10, 11},注意 Σ0 = {ε} 對于任何字母表 Σ,
在 Σ 上的所有任何長度的字串的集合是 Σ 的Kleene閉包并被指示為 Σ*, 依據Σn, ,例如,如果 Σ = {0, 1} 則 Σ* = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, …},盡管 Σ* 自身是可數無限的,Σ* 的所有元素都有有限長度,
在 Σ 上一個字串的集合(就是 Σ* 的任何子集)被稱為在 Σ 上的形式語言,例如,如果 Σ = {0, 1},則帶有偶數個零的字串的集合({ε, 1, 00, 11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001, 1010, 1100, 1111, …})是在 Σ 上的形式語言,

字符編碼
歷史上,字串資料型別為每個字符分配一個位元組,盡管精確的字符集隨著區域而改變,字符編碼足夠類似得程式員可以忽略它
— 同一個系統在不同的區域中使用的字符集組要么讓一個字符在同樣位置,要么根本就沒有它,這些字符集典型的基于ASCII碼
或EBCDIC碼,
意音文本的語言比如漢語、日語和朝鮮語(合稱為CJK)的合理表示需要多于256個字符(每字符一個位元組編碼的極限),常規的解決
涉及保持對ASCII碼的單位元組表示并使用雙位元組來表示CJK字形,現存代碼在用到它們會導致一些字串匹配和切斷上的問題,嚴
重程度依賴于字符編碼是如何設計的,某些編碼比如EUC家族保證在ASCII碼范圍內的位元組值只表示ASCII字符,使得使用這些字
符作為欄位分隔符的系統得到編碼安全,其他編碼如ISO-2022和Shift-JIS不做這種擔保,使得基于位元組的代碼做的匹配不安全,
另一個問題是如果一個字串的開頭被洗掉了,對解碼器的重要指示或關于在多位元組序列中的位置的資訊可能就丟失了,另一個
問題是如果字串被連接到一起(特別是在被不知道這個編碼的代碼截斷了它們的結尾之后),第一個字串可能不能導致編碼器
進入適合處理第二個字串的狀態中,
Unicode也有些復雜的問題,多數語言有Unicode字串資料型別(通常是UTF-16,因為它在Unicode補充位面介入之前就被增
加了),在Unicode和本地編碼之間轉換要求理解本地編碼,這對于現存系統要一起傳輸各種編碼的字串而又沒有實際標記出它
們用了什么編碼就是個問題,

 


 

主要操作 

1. 連接運算           concat(s1,s2,s3…sn) 相當于s1+s2+s3+…+sn.

例:concat(‘11’,'aa’)='11aa’;


2. 求子串            Copy(s,I,I) 從字串s中截取第I個字符開始后的長度為l的子串,
例:copy(‘abdag’,2,3)=’bda’


3. 洗掉子串        程序 Delete(s,I,l) 從字串s中洗掉第I個字符開始后的長度為l的子串,
例:s:=’abcde’;delete(s,2,3);結果s:=’ae’


4. 插入子串        程序Insert(s1,s2,I) 把s1插入到s2的第I個位置
例:s:=abc;insert(‘12’,s,2);結果s:=’a12bc’


5. 求字串長度       length(s) 例:length(‘12abc’)=5
在ASP中 求字串長度用 len(s)例: len("abc12")=5


6. 搜索子串的位置     pos(s1,s2) 如果s1是s2的子串 ,則回傳s1的第一個字符在s2中的位置,若不是子串,則回傳0.
例:pos(‘ab’,’12abcd’)=3


7. 字符的大寫轉換,   Upcase(ch) 求字符ch的大寫體,
例:upcase(‘a’)=’A’


8. 數值轉換為數串     程序 Str(x,s) 把數值x化為數串s.
例:str(12345,s); 結果s=’12345’


9. 數串轉換為數值      程序val(s,x,I) 把數串s轉化為數值x,如果成功則I=0,不成功則I為無效字符的序數,第三個引數也可不傳
例:val(‘1234’,x,I);結果 x:=1234


 

 

主要演算法

 

字串查找演算法

 

正則運算式演算法

 

模式匹配

 

字串的模式匹配演算法(KMP)

 

AC自動機

 

后綴陣列/樹/自動機

 

(這是一些字串處理演算法,在字串上進行不同的處理)


 

 

KMP(字串的模式匹配演算法)

 

KMP演算法的名字是由這個演算法的三個創始人Knuth、Morris、Pratt名字的首字母縮寫而得名的

下面是KMP演算法的C語言實作

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
 
typedef int Position;
#define NotFound -1
 
void BuildMatch( char *pattern, int *match )
{
    Position i, j;
    int m = strlen(pattern);
    match[0] = -1;
     
    for ( j=1; j<m; j++ ) {
        i = match[j-1];
        while ( (i>=0) && (pattern[i+1]!=pattern[j]) )
            i = match[i];
        if ( pattern[i+1]==pattern[j] )
             match[j] = i+1;    //i回退的總次數不會超過i增加的總次數
        else match[j] = -1;
    }
}
 
Position KMP( char *string, char *pattern )
{
    int n = strlen(string);       //O(n)
    int m = strlen(pattern);      //O(m)
    Position s, p, *match;
     
    if ( n < m ) return NotFound;
    match = (Position *)malloc(sizeof(Position) * m);
    BuildMatch(pattern, match);  //Tm=O(m)
    s = p = 0;
    while ( s<n && p<m ) {       //O(n)
        if ( string[s]==pattern[p] ) {
            s++; p++;
        }
        else if (p>0) p = match[p-1]+1;
        else s++;
    }
    return ( p==m )? (s-m) : NotFound;
}
 
int main()
{
    char string[] = "This is a simple example.";
    char pattern[] = "simple";
    Position p = KMP(string, pattern);
    if (p==NotFound) printf("Not Found.\n");
    else printf("%s\n", string+p);
    return 0;  
}

KMP這個演算法的關鍵在于下面這個BuildMatch函式的實作

 

這里有個值得注意的地方

PS:當pattern[match[j-1]+1]!=pattern[j]時

        下一個待與pattern[j]比較的元素下標為:

        match[match[j-1]]+1

 

程序的變化

 

 

 

 

 

 

 

通過對上面的分析我們可以得到KMP演算法的時間復雜度為   T=O(n+m) 

 (這對于形如查找指定文本中的關鍵字之類的問題而言效率已經很高了哦)

 

 


 

2019-12-22   12:54:08

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/114569.html

標籤:其他

上一篇:陣列與鏈表的應用—陣列記憶體模型

下一篇:Dijkstra演算法(樸素實作、優先佇列優化) POJ2387

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more