1. 程式人生 > >字串演算法題

字串演算法題

1. 替換空格

1.劍指offer:請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。 這裡我提供了兩種方法:①常規方法;②利用 API 解決。

public class Solution {

/**
 * 第一種方法:常規方法。利用String.charAt(i)以及String.valueOf(char).equals(" "
 * )遍歷字串並判斷元素是否為空格。是則替換為"%20",否則不替換
 */
public static String replaceSpace(StringBuffer str) {

	int length = str.length();
	// System.out.println("length=" + length);
	StringBuffer result = new StringBuffer();
	for (int i = 0; i < length; i++) {
		char b = str.charAt(i);
		if (String.valueOf(b).equals(" ")) {
			result.append("%20");
		} else {
			result.append(b);
		}
	}
	return result.toString();

}

/**
 * 第二種方法:利用API替換掉所用空格,一行程式碼解決問題
 */
public static String replaceSpace2(StringBuffer str) {

	return str.toString().replaceAll("\\s", "%20");
}

}

3.最長公共字首

Leetcode: 編寫一個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 “”。 示例 1:

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

示例 2:

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

在這裡插入圖片描述

4. 迴文串

4.1. 最長迴文串

LeetCode: 給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。在構造過程中,請注意區分大小寫。比如"Aa"不能當做一個迴文字串。注 意:假設字串的長度不會超過 1010。 示例 1:

輸入:
"abccccdd"

輸出:
7

解釋:
我們可以構造的最長的迴文串是"dccaccd", 它的長度是 7。

我們上面已經知道了什麼是迴文串?現在我們考慮一下可以構成迴文串的兩種情況:

①字元出現次數為雙數的組合 ②字元出現次數為雙數的組合+一個只出現一次的字元 統計字元出現的次數即可,雙數才能構成迴文。因為允許中間一個數單獨出現,比如“abcba”,所以如果最後有字母落單,總長度可以加 1。首先將字串轉變為字元陣列。然後遍歷該陣列,判斷對應字元是否在hashset中,如果不在就加進去,如果在就讓count++,然後移除該字元(解釋:因為是求迴文長度,所以最後結果是count2或者count2+1)!這樣就能找到出現次數為雙數的字元個數。

class Solution {
	public  int longestPalindrome(String s) {
		if (s.length() == 0)
			return 0;
		// 用於存放字元
		HashSet<Character> hashset = new HashSet<Character>();
		char[] chars = s.toCharArray();
		int count = 0;
		for (int i = 0; i < chars.length; i++) {
			if (!hashset.contains(chars[i])) {// 如果hashset沒有該字元就儲存進去
				hashset.add(chars[i]);
			} else {// 如果有,就讓count++(說明找到了一個成對的字元),然後把該字元移除
				hashset.remove(chars[i]);
				count++;
			}
		}
		return hashset.isEmpty() ? count * 2 : count * 2 + 1;
	}
}

4.2. 驗證迴文串 LeetCode: 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。 說明:本題中,我們將空字串定義為有效的迴文串。 示例 1:

輸入: "A man, a plan, a canal: Panama"
輸出: true

示例 2:

輸入: "race a car"
輸出: false

在這裡插入圖片描述

4.3. 最長迴文子串 LeetCode: 最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。

示例 2:

輸入: "cbbd"
輸出: "bb"

。。。。。。。。。。。。。。。。這題還有疑問???

5. 括號匹配深度 愛奇藝 2018 秋招 Java: 一個合法的括號匹配序列有以下定義: ①空串""是一個合法的括號匹配序列 ②如果"X"和"Y"都是合法的括號匹配序列,“XY"也是一個合法的括號匹配序列 ③如果"X"是一個合法的括號匹配序列,那麼”(X)"也是一個合法的括號匹配序列 ④每個合法的括號序列都可以由以上規則生成。

例如: “”,"()","()()","((()))“都是合法的括號序列 對於一個合法的括號序列我們又有以下定義它的深度: ①空串”“的深度是0 ②如果字串"X"的深度是x,字串"Y"的深度是y,那麼字串"XY"的深度為max(x,y) ③如果"X"的深度是x,那麼字串”(X)"的深度是x+1

例如: "()()()“的深度是1,”((()))"的深度是3。牛牛現在給你一個合法的括號序列,需要你計算出其深度。

輸入描述:
輸入包括一個合法的括號序列s,s長度length(2 ≤ length ≤ 50),序列中只包含'('和')'。

輸出描述:
輸出一個正整數,即這個序列的深度。

示例:

輸入:
(())
輸出:
2

程式碼如下:

在這裡插入圖片描述

6. 把字串轉換成整數 劍指offer: 將一個字串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。 在這裡插入圖片描述