论坛首页 Java企业应用论坛

合并字符串中所有的子字符串

浏览 12347 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-10  

网上看了一个面试题,感觉挺有意思,试着实现了一下,如下代码

package sort;

/**
 * @author ty93
 * @难度   ***
 * @算法: 合并一个字符串中的所有子字符串 例如12342343454565678789->123456789
 */
public class StringCombin {
	public static String fatherString = "";

	public static String getString(String str) {
		String stmp = "";
		int i;
		c: for (i = fatherString.length(); i < str.length(); i++) {
			if (fatherString.contains(String.valueOf(str.charAt(i)))) {
				int origin = i;
				int j;
				if (i == str.length() - 1) {
					String tempString = str.substring(str.length() - 2);
					if (!fatherString.contains(tempString))
						fatherString += tempString;
					break;
				} else if (i == str.length()) {
					fatherString += str.substring(str.length() - 1);
					break;
				}
				for (j = origin + 1; j < str.length(); j++) {
					String innString = str.substring(origin, j);
					if (fatherString.contains(innString)) {
					} else {
						if (j - origin > 2) {
							StringBuffer sb = new StringBuffer(str);
							stmp = sb.delete(origin, j - 1).toString();
							fatherString = "";
							break c;
						} else {
							stmp = str;
							fatherString = fatherString
									+ str.substring(origin, j - 1);

							break;
						}
					}
				}
			} else {
				fatherString = fatherString + String.valueOf(str.charAt(i));
			}
		}
		if (i == str.length()) {
			return fatherString;
		}
		System.out.println(stmp + "_" + fatherString);
		return getString(stmp);
	}

	public static void main(String[] args) {
		StringBuffer str = new StringBuffer("12342343454565678789");
		System.out.println(getString(str.toString()));
	}
}
 
   发表时间:2011-06-10  
先自己写一个  然后再看你的
0 请登录后投票
   发表时间:2011-06-10  
其实就是去除重复字符,原字符串里面的单个字符也是子串。

利用HashMap
public static String getString(String str) {
		Map<String,String> strMap = new LinkedHashMap<String,String>();
		for (int i = 0; i < str.length(); i++) {
			String ch = String.valueOf(str.charAt(i));
			if(!strMap.containsKey(ch)){
				strMap.put(ch, ch);
			}
		}

		StringBuffer sb = new StringBuffer();
		Set<Entry<String, String>> entrySet = strMap.entrySet();
		for (Entry<String, String> entry : entrySet) {
			sb.append(entry.getValue());
		}
		return sb.toString();
	}

0 请登录后投票
   发表时间:2011-06-10  
ptma 写道
其实就是去除重复字符,原字符串里面的单个字符也是子串。

利用HashMap
public static String getString(String str) {
		Map<String,String> strMap = new LinkedHashMap<String,String>();
		for (int i = 0; i < str.length(); i++) {
			String ch = String.valueOf(str.charAt(i));
			if(!strMap.containsKey(ch)){
				strMap.put(ch, ch);
			}
		}

		StringBuffer sb = new StringBuffer();
		Set<Entry<String, String>> entrySet = strMap.entrySet();
		for (Entry<String, String> entry : entrySet) {
			sb.append(entry.getValue());
		}
		return sb.toString();
	}


双字以上才叫子串吧。。。。
1 请登录后投票
   发表时间:2011-06-10   最后修改:2011-06-10
抛出异常的爱 写道

双字以上才叫子串吧。。。。


理论上:字符串 s1 中任意个连续的字符组成的子序列 s2 被称为是 s1 的子串,而称 s1
是 s2 的主串。 特别地,空串是任意串的子串。

--
不过这个要看具体的业务需求
0 请登录后投票
   发表时间:2011-06-10  
这道面试题肯定不是让你用set来实现的。 这属于jdk自带功能,本来就是要考你的想法

贴个自己写的 没考虑那么多 总之是实现了功能

   /**
     * 合并一个字符串中的所有子字符串 例如12342343454565678789->123456789 
     * 
     * @param input
     * @return merge result
     */
    public static String mergeAll(String input) {
        final int length = input.length();
        char[] output = new char[length];
        final char[] inputArr = input.toCharArray();
        int i = 0;
        int index = 0;
        for (char c : inputArr) {
            boolean exist = false;
            for (int j = 0; j < i; j++) {
                if (inputArr[j] == c) {
                    exist = true;
                    break;
                }
            }
            if (!exist) {
                output[index++] = c;
            }
            i++;
        }
        return new String(output).trim();
    }


0 请登录后投票
   发表时间:2011-06-10  
抛出异常的爱 写道
ptma 写道
其实就是去除重复字符,原字符串里面的单个字符也是子串。

利用HashMap
public static String getString(String str) {
		Map<String,String> strMap = new LinkedHashMap<String,String>();
		for (int i = 0; i < str.length(); i++) {
			String ch = String.valueOf(str.charAt(i));
			if(!strMap.containsKey(ch)){
				strMap.put(ch, ch);
			}
		}

		StringBuffer sb = new StringBuffer();
		Set<Entry<String, String>> entrySet = strMap.entrySet();
		for (Entry<String, String> entry : entrySet) {
			sb.append(entry.getValue());
		}
		return sb.toString();
	}


双字以上才叫子串吧。。。。

我感觉应该是双字或者以上才能叫字符串,应该是不能用set不然这道题的难度就大打折扣了,
0 请登录后投票
   发表时间:2011-06-10  
说不定人家就是考你set相关内容呢?!不要乱揣测


zha_zi 写道
抛出异常的爱 写道
ptma 写道
其实就是去除重复字符,原字符串里面的单个字符也是子串。

利用HashMap
public static String getString(String str) {
		Map<String,String> strMap = new LinkedHashMap<String,String>();
		for (int i = 0; i < str.length(); i++) {
			String ch = String.valueOf(str.charAt(i));
			if(!strMap.containsKey(ch)){
				strMap.put(ch, ch);
			}
		}

		StringBuffer sb = new StringBuffer();
		Set<Entry<String, String>> entrySet = strMap.entrySet();
		for (Entry<String, String> entry : entrySet) {
			sb.append(entry.getValue());
		}
		return sb.toString();
	}


双字以上才叫子串吧。。。。

我感觉应该是双字或者以上才能叫字符串,应该是不能用set不然这道题的难度就大打折扣了,

0 请登录后投票
   发表时间:2011-06-10  
没有这么面试的。。。如果用set会明说

freish 写道
说不定人家就是考你set相关内容呢?!不要乱揣测


zha_zi 写道
抛出异常的爱 写道
ptma 写道
其实就是去除重复字符,原字符串里面的单个字符也是子串。

利用HashMap
public static String getString(String str) {
		Map<String,String> strMap = new LinkedHashMap<String,String>();
		for (int i = 0; i < str.length(); i++) {
			String ch = String.valueOf(str.charAt(i));
			if(!strMap.containsKey(ch)){
				strMap.put(ch, ch);
			}
		}

		StringBuffer sb = new StringBuffer();
		Set<Entry<String, String>> entrySet = strMap.entrySet();
		for (Entry<String, String> entry : entrySet) {
			sb.append(entry.getValue());
		}
		return sb.toString();
	}


双字以上才叫子串吧。。。。

我感觉应该是双字或者以上才能叫字符串,应该是不能用set不然这道题的难度就大打折扣了,


0 请登录后投票
   发表时间:2011-06-10  
wanbin021614 写道
这道面试题肯定不是让你用set来实现的。 这属于jdk自带功能,本来就是要考你的想法

贴个自己写的 没考虑那么多 总之是实现了功能

   /**
     * 合并一个字符串中的所有子字符串 例如12342343454565678789->123456789 
     * 
     * @param input
     * @return merge result
     */
    public static String mergeAll(String input) {
        final int length = input.length();
        char[] output = new char[length];
        final char[] inputArr = input.toCharArray();
        int i = 0;
        int index = 0;
        for (char c : inputArr) {
            boolean exist = false;
            for (int j = 0; j < i; j++) {
                if (inputArr[j] == c) {
                    exist = true;
                    break;
                }
            }
            if (!exist) {
                output[index++] = c;
            }
            i++;
        }
        return new String(output).trim();
    }



要求是剔除重复的子字符串,
我认为剔除的过程 例如
13456234523745892375923857
下边是人工剔除步骤
步骤1:13456234523745892375923857 剔除345得到结果   13456223745892375923857
    2:13456223745892375923857    剔除45得到结果    134562237892375923857  
    3:134562237892375923857      剔除237得到结果   134562237895923857     
    4:134562237895923857         剔除23 得到结果   1345622378959857   
最后结果是  1345622378959857   
     得到结果1345622378959857 这个结果才是没有含有任何重复的子字符串
而且要考虑剔除节点的问题,和字符串末尾的处理


    

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics