每日一道演算法題 有效的括號(6 18)

2021-09-24 14:58:18 字數 2129 閱讀 2168

給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。

左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

示例 1:

輸入: 「()」

輸出: true

示例 2:

輸入: 「(){}」

輸出: true

示例 3:

輸入: 「(]」

輸出: false

示例 4:

輸入: 「([)]」

輸出: false

示例 5:

輸入: 「」

輸出: true

bool isvalid(char *s)

if(s[0]==')'||s[0]==']'||s[0]=='}')

return false;

char *new=(char *)malloc(strlen(s));

int k=0,i;

for(i=0;i0&&((s[i]==new[k-1]+1)||s[i]==new[k-1]+2))

else}}

if(k==0)

else

}

①首先判斷字串長度,如果小於等於2,返回false

if(n<=2)

②建立乙個字串和s 一樣大的字串輸出 儲存左括號

char *new=(char *)malloc(strlen(s));
③記錄左括號個數存入new中最小為1

int k=0,i;

for(i=0;i④判斷當前的右括號值是否是對稱的

else

⑤如果左右對應相等即k=0,則返回true

if(k==0)

else

完整**可以這樣寫:

#include#include#include#includebool isvalid(char *s)

if(s[0]==')'||s[0]==']'||s[0]=='}')

return false;

char *new=(char *)malloc(strlen(s));

int k=0,i;

for(i=0;i0&&((s[i]==new[k-1]+1)||s[i]==new[k-1]+2))

else

}

}if(k==0)

else

} int main(int argc, const char *ar**)

; scanf("%s",c);//手動輸入字元陣列

isvalid(c);

return 0;

}

①手動輸入乙個字元陣列

char c={};

scanf("%s",c);//手動輸入字元陣列

②指標與陣列的關係

當乙個指標變數被初始化成陣列名時,就說該指標變數指向了陣列。如:

char str[20], *ptr;

ptr=str;

ptr被置為陣列str的第乙個元素的位址,因為陣列名就是該陣列的首位址,也是陣列第乙個元素的位址。此時可以認為指標ptr就是陣列str(反之不成立),這樣原來對陣列的處理都可以用指標來實現。如對陣列元素的訪問,既可以用下標變數訪問,也可以用指標訪問。

指向陣列元素的指標

若有如下定義:

int a[10], *pa;

pa=a;

則p=&a[0]是將陣列第1個元素的位址賦給了指標變數p。

這兩種方法在形式上相像,其區別在於:pa是指標變數,a是陣列名。值得注意的是:pa是乙個可以變化的指標變數,而a是乙個常數。因為陣列一經被說明,陣列的位址也就是固定的,因此a是不能變化的,不允許使用a++、++a或語句a+=10,而pa++、++pa、pa+=10則是正確的。由此可見,此時指標與陣列融為一體。

每日一道演算法題

no.1 設指標變數fron t表示鏈式佇列的隊頭指標,指標變數rear表示鏈式佇列的隊尾指標,指標變數s指向將要入佇列的結點x,則入佇列的操作序列為 a.front next s front s b.s next rear rear s crear next s rear s d.s next f...

每日一道演算法題

no.1 若有 18 個元素的有序表存放在一維陣列 a 19 中,第乙個元素放 a 1 中,現進行二分查詢,則查詢 a 3 的比較序列的下標依次為 a.1,2,3 b.9,5,2,3 c.9,5,3 d.9,4,2,3 答案 d.第一次查詢,隊首為下標1,隊尾下標18,所以是 1 18 2 9 第二...

每日一道演算法題 TwoSum

167.給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 index1 和 index2 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且你不可...