數組標記法在算法題中的應用


#數組標記法在算法題中的應用
什么?!你還不知道數組在算法題中不僅起儲存數據的作用,還可以起鏈接標記的作用?哈哈不要緊,原來我也是不知道的,我是看了我好哥們的做題思路才知道這個方法的。。。
----
我們先聲明一個長度為5數組arr[5],再為arr[5]賦值arr[]={"q","w","e","r",“t”}。這樣我們訪問arr[0]值為“q”,arr[1]值為w...你會發現通過數組arr[i]=某個字母,序號與字母形成了一種索引關系,即序號指向了數組中的某一個元素,這就好比Python中的字典,C++中的map,數組的序號可以看做是鍵(key),對應的元素就可以看做是值(value),這樣我們就可以解決很多問題,比如讓編譯器和我們都頭疼的數組(或字符串去重問題),PTA中有很多這樣的例題,下面我們看一道。。。
---
1093 字符串A+B (20 分)
給定兩個字符串 A 和 B,本題要求你輸出 A+B,即兩個字符串的並集。要求先輸出 A,再輸出 B,但重復的字符必須被剔除。

輸入格式:
輸入在兩行中分別給出 A 和 B,均為長度不超過 10^6的、由可見 ASCII 字符 (即碼值為32~126)和空格組成的、由回車標識結束的非空字符串。

輸出格式:
在一行中輸出題面要求的 A 和 B 的和。

輸入樣例:
This is a sample test
to show you_How it works
輸出樣例:
This ampletowyu_Hrk
---
字符串拼接可以說是基本操作,我們在這兒就不在贅述了(拼接后的的字符串我們聲明為a吧),我們主要談談如何實現字符串去重,常規方法,也是最容易想到的方法就是,設立兩層循環,復制a字符串(副本我們稱之為b吧)外層循環遍歷拼接后字符串的每個字母,內層循環用外層當前的字母i與副本b中的當前字符i以后的字符比較,如果在b中沒有找到與當前字符相同的字符,我們就輸出i;這樣做的時間復雜度為O(n^2).
我們大可以換個思路。。。字符和是否重合的狀態其實是一個索引的關系,即每個字符對應了一種狀態(有或無),這樣我們就可以使用我們之間提到的數組來維持兩者的關系。當然你會說數組的序號是一個數字,怎么能把字符當序號呢?答案是字符都對應這唯一的ASCII碼啊,這就可以作為數組索引的目錄。
(```)
#include<stdio.h>
#include<string.h>
int main()
{
     char a1[100000];
     char b1[100000];
     int c[128] = { 0 };//初始化這個數組的的所有元素都為0
     gets(a1);
     gets(b1);
     for (int i = 0; i <strlen(a1); i++)
     {
         if (c[a1[i]] == 0)
         {
             c[a1[i]] = 1;
             printf("%c",a1[i]);
         }
     }
     for (int i = 0; i < strlen(b1); i++)
     {
         if (c[b1[i]] == 0)
         {
             c[b1[i]] = 1;
/*每當出現一個新字符就講b1[i]在c中對應的值改成1,當之后讀取到c[b1[i]]==1時,程序就知道b1[i]在之前出現過了*/
             printf("%c",b1[i]);
         }
     }
     return 0;
}
(```)
 
這樣我們就完成了對字符串的去重處理,時間復雜度O(n),在OJ中更有優勢。當然這只是數組標記法在本題中中的一個小小應用,至少在PTA中這個方法屢試不爽,希望大家都能夠運用好此方法,為自己的算法刷題錦上添花。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM