0410-無重複字符的最長子串

/**
 * Longest Substring Without Repeating Characters
 * 無重複字符的最長子串
*/

#include <string.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
int lengthOfLongestSubstring1(string s) {
    map<char, int> m;
    int maxLen = 0;
    int lastRepeatPos = -1;
    for(int i=0; i<s.size(); i++){
        if (m.find(s[i])!=m.end() && lastRepeatPos < m[s[i]]) {
            lastRepeatPos = m[s[i]];   //m.find()將需要匹配的數組排序或者添加到m中   逐個迭代數組
        }
        if ( i - lastRepeatPos > maxLen ){    
            maxLen = i - lastRepeatPos;   //i表示字符是否出現重複,迭代lastRepeatPos部分
        }
        m[s[i]] = i;
    }
    return maxLen;
}
//don't use <map>
int lengthOfLongestSubstring(string s) {
    const int MAX_CHARS = 256;
    int m[MAX_CHARS];
    memset(m, -1, sizeof(m));
    int maxLen = 0;
    int lastRepeatPos = -1;
    for(int i=0; i<s.size(); i++){
        if (m[s[i]]!=-1 && lastRepeatPos < m[s[i]]) {
            lastRepeatPos = m[s[i]];
        }
        if ( i - lastRepeatPos > maxLen ){
            maxLen = i - lastRepeatPos;
        }
        m[s[i]] = i;
    }
    return maxLen;
}
int main(int argc, char** argv)
{
    string s = "abcabcbb";
    cout << s << " : " << lengthOfLongestSubstring(s) << endl;
    s = "bbbbb";
    cout << s << " : " << lengthOfLongestSubstring(s) << endl;
    s = "bbabcdb";
    cout << s << " : " << lengthOfLongestSubstring(s) << endl;
    if (argc>1){
        s = argv[1];
        cout << s << " : " << lengthOfLongestSubstring(s) << endl;
    }
    return 0;
}

新知識點:MEMSET函數,

int a[100]; memset(a, MAX,sizeof(a));就是將a數組全部賦值爲MAX,現在才知道他的填充是以字節爲單位,一般用於對字符型變量的初值進行賦值.;

memset() 函數常用於內存空間初始化;

將s所指向的某一塊內存中的每個字節的內容全部設置爲ch指定的ASCII值

塊的大小由第三個參數指定,這個函數通常爲新申請的內存做初始化工作,其返回值爲指向S的指針。

void *memset(void *s,int c,size_t n)  

總的作用:將已開闢內存空間 s 的首 n 個字節的值設爲值 c。

memset() 函數用來將指定內存的前n個字節設置爲特定的值,其原型爲:
    void * memset( void * ptr, int value, size_t num );

參數說明:

  • ptr 爲要操作的內存的指針。
  • value 爲要設置的值。你既可以向 value 傳遞 int 類型的值,也可以傳遞 char 類型的值,int 和 char 可以根據 ASCII 碼相互轉換。
  • num 爲 ptr 的前 num 個字節,size_t 就是unsigned int。

【函數說明】memset() 會將 ptr 所指的內存區域的前 num 個字節的值都設置爲 value,然後返回指向 ptr 的指針。
memset() 可以將一段內存空間全部設置爲特定的值,所以經常用來初始化字符數組。例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    // 不可以聲明爲 char *str = "http://c.biancheng.net";
    char str[] = "http://c.biancheng.net";
    memset(str, '-', 7);
    puts(str);

    system("pause");
    return EXIT_SUCCESS;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章