1. 程式人生 > >找出字串中第一個不重複的字母

找出字串中第一個不重複的字母

昨天看到一個面試題,說是要在一個字串中找到第一個不重複的字元。

初始思路如下:

掃描一遍字串,生成一個連結串列,越早出現的字元越靠近連結串列頭,最後出現的在連結串列尾。每次從字串中掃描到一個字元後,在連結串列中搜索,找到則其計數加一,否則加入到連結串列尾。最後遍歷這個連結串列,第一個出現次數為1的就是第一個不重複的字元。

改進後方法:

考慮到如果字串很長,每次需要去連結串列中查詢是否有此字元,因此設計一個索引Index[26]對應26個英文字母,此索引元素是指向連結串列節點的指標。每次判斷掃描的字元是否存在時,直接看Index[m]是否為NULL,是則將其加入到連結串列尾,同時位置賦值給此索引。反之,直接自加一。

編譯平臺:Redhat AS 5(kernel 2.6.18) gcc 4.1.1版本

程式不足之處:假設了字串是26個英文小寫字母組成。

/*
 * =====================================================================================
 *
 *       Filename:  findfirstUnrepeatChar.c
 *
 *    Description: find the first unrepeat character in a string. 
 *
 *        Version:  1.0
 *        Created:  03/30/2012 10:49:16 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Lujp (harry), 
[email protected]
* Organization: * * ===================================================================================== */ #include <stdlib.h> #include <stdio.h> #include <malloc.h> #define ENGLISH_CHAR_NUM 26 typedef struct _ListNode{ char ch_data; int showup_times; struct _ListNode *next; }ListNode, *pListNode; int FindFirstUnrepeatChar(char *str, char *find) { if (str == NULL || find == NULL) { printf("parameter wrong.\n"); return -1; } pListNode Index[ENGLISH_CHAR_NUM] = {NULL}; pListNode list_head, list_end; pListNode temp = NULL; list_head = NULL; list_end = NULL; char *temp_str = str; int CharNum = 0;//字母在26個字母中的順序數 for(; *temp_str != '\0'; temp_str++) { CharNum = *temp_str - 'a'; if (CharNum >= 26 || CharNum <0) { printf("invalid character in the string.\n"); return -1; } if (Index[CharNum] == NULL) { temp = (pListNode)malloc(sizeof(ListNode)); if (temp == NULL) { printf("malloc failed.\n"); return -1; } temp->ch_data = *temp_str; temp->showup_times = 1; temp->next = NULL; Index[CharNum] = temp; if (list_head == NULL) { list_head = temp; list_end = temp; } else { list_end->next = temp; list_end = temp; } } else { Index[CharNum]->showup_times += 1; } } temp = list_head; while(temp != NULL) { if (temp->showup_times == 1) { *find = temp->ch_data; break; } temp = temp->next; } if (temp == NULL) { printf("No Unrepeat Char\n"); } for (CharNum = 0; CharNum < ENGLISH_CHAR_NUM; CharNum++) { if (Index[CharNum] != NULL) { free(Index[CharNum]); Index[CharNum] = NULL; } } return 0; } int main() { char str[] = "abcdefghiabcefi"; int rc = 0; char find; rc = FindFirstUnrepeatChar(str, &find); printf("return value: %d, find = %c\n", rc, find); return rc; }

相關推薦

如何字串第一重複的字元,Java和Python的分別實現

遇到一個問題,網上有很多教程,在沒看的情況下,自己先寫了幾種方法,僅供參考: Python實現方式:(三種方法,執行效率有差異) # _*_ coding:utf-8 _*_ import time # 傳參方式 str = "=WUKVJPLKKPYBUI=JAOCFCJJIYKGN

字串第一重複字母

昨天看到一個面試題,說是要在一個字串中找到第一個不重複的字元。 初始思路如下: 掃描一遍字串,生成一個連結串列,越早出現的字元越靠近連結串列頭,最後出現的在連結串列尾。每次從字串中掃描到一個字元後,在連結串列中搜索,找到則其計數加一,否則加入到連結串列尾。最後遍歷這個連結串

給定字串第一重複的字元

給定一串字串,找出其中第一個不重複的字元。 如:輸入”abcddcaeb1~soop”,輸出’e’ 方法一 思路: 定義list<char> store和list<char> storeDel,對輸入字串str進行遍歷,對st

查詢字串第一重複的字元

題目要求: 找到字串中第一個不重複的字元,並按原字元顯示,要求可以區分大小寫,預設不區分,true 表示區分, false表示不區分大小寫 示例:輸入Abcad,輸出b; 輸入Abcad true ,輸出A; 輸入Abcad false, 輸出 b

找到字串第一重複的元素

題目:在一個字串中找到第一個沒有重複元素的字元並返回。 例:輸入:"yellow"      返回:“y”   輸入:"tooth"   返回:“h”   輸入:“coco”   返回:“” 按照人類思維來判斷的話,比較該元素與後面的元素,如果相同,再比較

【Java筆試題】輸出字串第一重複的字元

1、題目 在一個字串中找到第一個只出現一次的字元。例如,輸入“abaccdeff”,則輸出b。 2、Java程式碼 public class RetStr { public static

劍指offer--字串第一只出現一次的字元(題面已經更新)C++

題目描述: 找出字串中第一個只出現一次的字元 輸入描述: 輸入一個非空字串 輸出描述: 輸出第一個只出現一次的字元,如果不存在輸出-1 示例1 輸入 asdfasdfo 輸出 ö 程式碼實現如下: #include<iostream>

C語言面試題:查詢字串第一重複的字元

char findChar(char *s) { char *p,*q; p=q=s; while(*s != '\0') { while(*p++ != '\0')

python實現一個字串第一重複出現的字元

例:輸入:yellow       輸出:y      輸入:tooth      輸出:h思想:使用字典進行遍歷:def find_str(arr): dic={} for i in range(len(arr)): if arr[i] in

劍指offer系列——表示數值的字串,字元流第一重複的陣列,連結串列中環的入口結點

表示數值的字串 題目描述 請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 解題思路:

劍指offer 54. 字元流第一重複的字元

題目描述 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 輸出描述: 其實主要就是多了插入函式,出現字元。 引

劍指offer——(15)第一只出現一次的字元 && 陣列重複的數字 && 字元流第一重複的字元

public class Solution { public int FirstNotRepeatingChar(String str) { if(str.length()<=0) return -1; char c[] = str.toC

(劍指offer)字元流第一重複的字元

時間限制:1秒 空間限制:32768K 熱度指數:91819 本題知識點: 字串 題目描述 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現

劍指offfer------字元流第一重複的字元

題目 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 輸出描述: 如果當前字元流沒有存在出現一次的字元

劍指offer 字元流第一重複的字元 python

題目描述 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 樣例 輸入 "google" 輸出 "ggg#ll

劍指offer--54字元流第一重複的字元

請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 輸出描述: 如果當前字元流沒有存在出現一次的字元,返回#字元。 &nb

[劍指offer] 54. 字元流第一重複的字元

題目描述 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 輸出描述: 如果當前字元流沒有存在出現一次的字元,返回#字元

字串的最長重複子串,輸出長度和子串

方法一:窮舉法,空間複雜度是O(1),時間複雜度是O(N^4) <pre name="code" class="java">public class Max_substring { public int max_unique_substring(char

劍指offer_面試題55_字元流第一重複的字元 *

題目:請實現一個函式用來找出字元流中第一個只出現一次的字元。 例如,當從字元流中只讀出前兩個字元“go”時,第一個只出現一次的字元是“g”。當從該字元流中讀出前六個字元“google”時,第一個只出現一次的字元時“l”。 ps. 本題,我在阿里二面的時候,被問到了,需要注

字元流第一重複的字元

題目描述 請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。  輸出描述: 如果當前字元流沒有存在出現一