1. 程式人生 > >判斷兩個字符串是否互為變形詞

判斷兩個字符串是否互為變形詞

比對 種類 字符串變量 取值 字母 ebo 如果 html als

題目

給定兩個字符串str1和str2,如果str1和str2中出現的字符種類一樣且每種字符出現的次數也一樣,那麽str1和str2互為變形詞。請實現函數判斷兩個字符串是否互為變形詞。

例如:

  • str1="132",str2="321",返回true
  • str1="123",str2="2331",返回false

難度:??

設計

  • 一個接收兩個字符串的判斷並返回布爾值的方法
boolean isDeformation(String str1,String str2){}
  • 互為變形詞實質上就是判斷兩字符串長度是否等同,與字符是否共同出現過
    • 先從簡單的入手,設置第一層過濾條件
    if(str1 == null || str2 == null || str1.length() != str2.length()){
        return false;
    }
    • 比對兩個字符串變量中的每個字母是否共同出現過(ASCII)
      • 將字符串作為字符數組存儲
        java char[] chars1 = str1.toCharArray(); char[] chars2 = str2.toCharArray();
      • 一個記錄字符出現頻次的計數器,字符作為獨立的個體存在,還是需要用數組作為每個字符出現頻次的計數器,這篇資料 ASCII碼 很好的說明了ASCII的取值範圍
        java int[] ints = new int[256];
      • 記錄字符的出現頻次
        • 記錄str1的字符出現頻次
         for (int i = 0; i < chars1.length; i++) {
                ints[chars1[i]]++;
        }
        • 再以此進行比對 str2 的字符出現頻次
         for (int i = 0; i < chars2.length; i++) {
                if(ints[chars2[i]] == 0){
                    return false;
                }
        }
        /** 滿足條件跳出並返回true */
        return true;

實現

import org.junit.Assert;
import org.junit.Test;

/**
 * @author lorem
 */
public class StringStringGoTest {
    boolean isDeformation(String str1, String str2) {

        if (str1 == null || str2 == null || str1.length() != str2.length()) {
            return false;
        }
        char[] chars1 = str1.toCharArray();
        char[] chars2 = str2.toCharArray();
        int[] ints = new int[256];
        for (int i = 0; i < chars1.length; i++) {
            ints[chars1[i]]++;
        }
        for (int i = 0; i < chars2.length; i++) {
            if (ints[chars2[i]] == 0) {
                return false;
            }
        }
        return true;
    }
    @Test
    public void test(){
        String str1 = "asd";
        String str2 = "asd";
        Assert.assertEquals(true,isDeformation(str1,str2));
    }
}

判斷兩個字符串是否互為變形詞