字符串将n个字符串串联到单个字符串

时间:2016-09-17 08:41:32

标签: string concatenation string-concatenation

如何连接给定的n个字符串以形成单个字符串,以便在组合两个字符串时,第一个字符串的最后一个字符应与下一个字符串的第一个字符相同。

例如:

  

输入:ab2c,h23f2,c4dsh

     

输出:ab2cc4dshh23f2

我尝试使用hashmap有没有更好的解决方案?我无法处理像

这样的情况
  

输入:ab2c,h23fc,c555ab,c4dsh,

     

输出:ab2cc4dshh23fcc555ab

在上面的示例中,第二个字符串有两种可能性,但是使用c555ab将导致字符串结束。如果在不同层面有很多可能性如何处理它们以便得到正确的答案?

2 个答案:

答案 0 :(得分:1)

这是一个简单的欧拉路径问题。

  
      
  1. 绘制一个有(26+10)个节点的有向图,每个节点对应一个   小写英文字母(a-z)和10位数字(0-9)
  2.   
  3. 对于第i个给定的字符串,请画一个从第一个字符开始的边   到字符串的最后一个字符。例如。对于字符串abcd-画一条边   从节点a到节点d
  4.   
  5. 在此图中找到一条欧拉路径。欧拉路径是访问的路径   图的每个边缘一次。
  6.   

理解在欧拉路径中从边a-b移到b-c意味着将两个字符串连接在一起,共同字母为b,相反的结束字符分别为a和{ {1}}。

方法的正确性-

  

一条欧拉路径将恰好一次访问每个边缘,这意味着每个   字符串仅使用一次,并按路径访问的顺序连接   节点。

     

确保存在欧拉路径,然后仅尝试欧拉路径   算法。

答案 1 :(得分:0)

假设函数被调用concat并将一个字符串数组pool作为第一个参数,并将累加器*字符串s作为第二个参数:

每次进入concat功能时,您都可以查看以下规则:

  1. 如果pool为空,则返回s,因为这是正确答案。
  2. 如果s中的pool没有可接受的匹配项,则返回null或某些指示符表示输入没有合适的答案。
  3. 递归所有可接受的比赛,直到:没有比赛,或者找到正确答案。
  4. 这最终会导致正确的答案,或者输入无效的其他指标值。

    *累加器字符串是在递归函数调用之间累加值的字符串。在这种情况下,它将在初始调用中作为空字符串开始,然后在每次调用concat深入调用堆栈时,它将通过pool的匹配进行连接。

    这是一个小型的javascript实现,如果你运行它会生成一个有点冗长的日志:

    function concat(pool, s) {
    	s = s === undefined ? '' : s;
    	if (pool.length === 0) {
    		log("empty pool, s: " + s);
    		return s;
    	}
    	for (let itr = 0; itr < pool.length; ++itr) {
    		let v = pool[itr];
    		if (s.length === 0 || v.charAt(0) === s.charAt(s.length - 1)) {
    			log(s + v + " is a candidate path, searching...");
    			let ret = concat(nSlice(pool, itr), s + v);
    			if (ret !== null) {
    				log("returning non-null ret: " + ret);
    				return ret;
    			}
    			log(s + v + " hit a dead end, continuing...");
    		} else {
    			log(s + v + " was not a candidate path, continuing...");
    		}
    	}
    	log("Returning null for given s: " + s);
    	return null;
    }
    
    function nSlice(arr, index) {
    	let a = arr.slice(0);
    	a.splice(index, 1);
    	return a;
    }
    
    function log(m) {
        console.log(m);
        let e = document.createElement('div');
        e.innerHTML = m;
        document.body.appendChild(e);
    }
    
    [
    	['ab2c', 'h23f2', 'c4dsh'],
    	['ab2c', 'h23fc', 'c555ab', 'c4dsh'],
    	['h23fc', 'c555ab', 'c4dsh', 'ab2c']
    ].forEach(v => {
    	concat(v);
    	log("------------------");
    });