LeetCode-14. 最長公共字首

kewlgrl發表於2018-04-30

14. 最長公共字首


編寫一個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 ""

示例 1:

輸入: ["flower","flow","flight"]
輸出: "fl"

示例 2:

輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共字首。

說明:

所有輸入只包含小寫字母 a-z 。


C
#include<bits/stdc++.h>
using namespace std;
/********************提交程式碼********************/
char* longestCommonPrefix(char** strs, int strsSize)
{
    if(strsSize==0||(*strs==0x0))//判斷是否空串
        return "";
    if(strsSize==1)//判斷是否僅一個串
        return strs[0];
    int i=0,j=0,k=1,cnt=0,len,maxlen=0x3f3f3f3f;
    char *ans=(char*)malloc(1529*sizeof(char));//可改為更大的數值,因為1529為二分嘗試提交後發現最小能AC的單串長度
    for(i=0; i<strsSize; ++i)//計算最小串的長度,即最長遍歷長度
    {
        len=strlen(strs[i]);
        if(len<maxlen)//不支援min方法
            maxlen=len;
    }
    if(maxlen==0)//含有空串
        return "";
    for(i=0; i<strsSize-1; ++i)//遍歷第i個和第i+1個串的第j個字元
    {
        if(strs[i][j]==strs[i+1][j])
            ++k;
        if(i==strsSize-2)//所有串的第j個字元便歷完畢
        {
            if(k==strsSize)//所有串的第j個字元都相同
                ans[cnt++]=strs[i][j];
            else if(j==0)//首字母都不相同
                return "";
            ++j;//準備遍歷第j+1個字元
            i=-1;
            k=1;//預設自己為1個相同位
        }
        if(j>maxlen)//截止到最長遍歷長度
            break;
    }
    if(cnt==0)//未獲取到公共串
        return "";
    return ans;
}
/***************************************************/
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("F:/cb/read.txt","r",stdin);
    //freopen("F:/cb/out.txt","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int strsSize;
    while(cin>>strsSize)
    {
        char** strs=(char**)calloc(2000,sizeof(char*));
        for (int i=0; i<2000; ++i)
            strs[i]=(char*)calloc(2000,sizeof(char));
        cin.getline(strs[0],2000);
        for(int i=0; i<strsSize; ++i)
        {
            cin.getline(strs[i],2000);
            //cout<<"/"<<strs[i]<<"/"<<endl;
        }
        cout<<"/"<<longestCommonPrefix(strs,strsSize)<<"/"<<endl;
        free(strs);
    }
    return 0;
}

思路非常簡單:遍歷判斷每個串的每位是否相同。

但是是極其噁心的一道題,因為最大串的長度未知(ヽ(`Д´)ノ︵ ┻━┻ ┻━┻ 要是ACM的題目肯定不會出現這種不告知資料範圍的毛病),我一開始開到了1000但是WA後來開到2000就AC了所以賊浪費時間找bug賊生氣!

所以!!本題當前(20180430/00:11)測試用例來說能AC的最大串的長度的最小1529!!

( • ̀ω•́ )✧不過順便回顧了一下二級指標還有一些字元陣列指標的初始化什麼的還是挺開心的~~


附測試用例

2


2
cba

1
abc
3
a
ac
3
dog
racecar
car
3
flower
flow
flight


相關文章