文字ストリームに1回だけ現れる最初の文字を見つける関数を実装してください。たとえば、最初の2文字「go」が文字ストリームから読み取り専用である場合、1回だけ表示される最初の文字は「g」です。文字ストリームから最初の6文字「google」を読み取る場合、1回だけ表示される最初の文字は「l」です。
現在の文字ストリームに1回出現する文字がない場合は、#文字が返されます。
アイデア:
1つの配列のみを使用して、配列に複数回出現するかどうかを判断できるだけでなく、一度出現したときに、配列は文字ストリーム内の文字の位置と配列インデックスを格納します。文字のASCIIコードに対応します。ASCIIコードは128文字なので、配列のサイズで128
十分です。
配列の初期値に-1を割り当てます。文字が初めて表示されるときは、文字ストリーム内の現在の文字のインデックス(位置)に-1を更新します。2回目に表示されると、以前に割り当てられたインデックスが上書きされ、その後の判断を入力する必要はありません。ここでは、割り当ては-2)として選択されます。也就是说,没出现过,数组记录-1,出现一次,数组记录位置,出现多次,数组记录成-2
。
FirstAppearingOnceメソッドでは、正しい解を見つけるために配列をトラバースする必要があるため、次の2つのことを行う必要があります。
- 初めて出現する文字を返す必要があるため、一度出現するすべての文字を検索します。
- 文字ストリームに1回出現する各文字の位置を比較し、最初に出現する文字、つまり位置が最も小さい文字を見つけます。そのため、キャラクターの位置を記録する変数も設定する必要があります。次に出現するキャラクターを見つけたら、一度だけ出現する2つのキャラクターの位置を比較し、どちらが進んでいるかを確認します。
要約すると、このメソッドは配列のみを使用して、文字が1回出現するかどうか、および1回出現するときの文字ストリーム内の位置を記録します。
import java.util.*;
public class Solution {
private int index = 0;
private static int[] arr = new int[128];
static{
Arrays.fill(arr,-1);
}
//Insert one char from stringStream
public void Insert(char ch){
if(arr[ch] == -1){
arr[ch] = index;
}else if(arr[ch]>=0){
arr[ch] = -2;
}
index++;
}
//return the first appearance once char in current stringStream
public char FirstAppearingOnce(){
int minIndex = Integer.MAX_VALUE;
char res = '#';
for(int i=0; i<128; i++){
if(arr[i]>=0 && arr[i] < minIndex){
res = (char)i;
minIndex = arr[i];
}
}
return res;
}
}
時間計算量:O(N)
空間計算量:O(N)